欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1953|回復: 5
收起左側

求大神幫忙指導改改單片機74hc595按鍵程序

[復制鏈接]
回帖獎勵 250 黑幣 回復本帖可獲得 50 黑幣獎勵! 每人限 1 次
ID:837877 發表于 2020-11-19 10:53 | 顯示全部樓層 |閱讀模式
需要s1按鍵為按一下正向移動在按一下暫停,s2為按一下反向移動在按一下暫停,找不到問題在哪里,暫停也不會在當前進度暫停而是回到開始了。
#include<reg51.h>


sbit shcp=P1^2;//數據輸入時鐘線 595的11腳
sbit stcp=P1^1;//輸出存儲器鎖存時鐘線 595的12腳
sbit ds=P1^0;//數據線  595的14腳


sbit s1=P3^1;//按下后會暫停,再按就會繼續
sbit s2=P3^2;//按下后顯示數字的傳送方向取反
bit fx;//方向切換
unsigned char TIME1;//設置數據移動定時時間
unsigned int ABC;//設置控制顯示的字符
unsigned char DD=4;
unsigned int ZZ;//總字符
unsigned char code tab[]={




0x02,0x04,0x22,0x48,0x2A,0x52,0xA6,0x41,0x63,0xFE,0x26,0x40,0x2A,0x50,0x22,0x49,
0x00,0x06,0x3F,0xF8,0x22,0x00,0x22,0x00,0x23,0xFF,0x42,0x00,0x02,0x00,0x00,0x00,//顯示’新’字


0x04,0x20,0x08,0x20,0x10,0x20,0x3F,0xA0,0xC0,0x20,0x04,0x20,0x04,0x20,0x08,0xFF,
0xFE,0x20,0x11,0x20,0x11,0x20,0x21,0x20,0x41,0x20,0x07,0x20,0x00,0x20,0x00,0x00,//顯示‘華’字


0x02,0x20,0x0C,0x20,0x88,0x20,0x69,0x20,0x09,0x20,0x09,0x22,0x89,0x21,0x69,0x7E,
0x09,0x60,0x09,0xA0,0x19,0x20,0x28,0x20,0xC8,0x20,0x0A,0x20,0x0C,0x20,0x00,0x00,//顯示’學‘字


0x00,0x00,0x7F,0xFF,0x44,0x20,0x5A,0x10,0x61,0xE0,0x08,0x01,0x30,0x82,0x24,0x8C,
0x24,0xF0,0xA4,0x80,0x64,0x80,0x24,0xFC,0x24,0x82,0x28,0x82,0x30,0x8E,0x00,0x00,//顯示‘院‘字


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};


unsigned char code tab1[]={

0x00,0x00,0x7F,0xFF,0x44,0x20,0x5A,0x10,0x61,0xE0,0x08,0x01,0x30,0x82,0x24,0x8C,
0x24,0xF0,0xA4,0x80,0x64,0x80,0x24,0xFC,0x24,0x82,0x28,0x82,0x30,0x8E,0x00,0x00,//顯示’院‘字


0x02,0x20,0x0C,0x20,0x88,0x20,0x69,0x20,0x09,0x20,0x09,0x22,0x89,0x21,0x69,0x7E,
0x09,0x60,0x09,0xA0,0x19,0x20,0x28,0x20,0xC8,0x20,0x0A,0x20,0x0C,0x20,0x00,0x00,//顯示‘學’字


0x04,0x20,0x08,0x20,0x10,0x20,0x3F,0xA0,0xC0,0x20,0x04,0x20,0x04,0x20,0x08,0xFF,
0xFE,0x20,0x11,0x20,0x11,0x20,0x21,0x20,0x41,0x20,0x07,0x20,0x00,0x20,0x00,0x00,//顯示‘華’字


0x02,0x04,0x22,0x48,0x2A,0x52,0xA6,0x41,0x63,0xFE,0x26,0x40,0x2A,0x50,0x22,0x49,
0x00,0x06,0x3F,0xF8,0x22,0x00,0x22,0x00,0x23,0xFF,0x42,0x00,0x02,0x00,0x00,0x00,//顯示‘新’字

};
void delay(unsigned int dz)//設置延時子函數
{
   unsigned char x1;
   for(;dz>0;dz--)
   for(x1=999;x1>0;x1--);
}
void writedata(unsigned char d1,unsigned char d2)         //設置595顯示子函數
{
        unsigned char i;
        //設置CY存儲移位之后的數據  設置CY進位標志位,單片機內部的寄存器,移位之后的數據保存在CY
        for(i=0;i<8;i++)//設置八次循環
        {
                d1=d1<<1;//令數據左移11110001
                ds=CY;//設置發送數據
                shcp=1;//上升沿發生移位,數據寄存器的數據鎖存。
                shcp=0;
        }
        for(i=0;i<8;i++)//同樣設置八次循環
        {
                d2=d2<<1;//令數據左移
                ds=CY;//設置發送數據
                shcp=1;//上升沿發生移位,數據寄存器的數據鎖存 。
                shcp=0;
        }
        stcp=0;      
        stcp=1;//上升沿將數據送到輸出鎖存器   
        stcp=0;
}


void main()
{
        char i,aa;
        TMOD=0x01;//設置定時器0與模式1與16位定時模式
        TH0=(65536-10000)/256;//定時10.000ms
        TL0=(65536-10000)%256;
        ET0=1;//使能定時器0
        EA=1;//設置開啟總中斷
    TR0=1;//開始計數
        ZZ=(DD+1)*32;
        while(1)         //設置無限循環
        {
                if(s1==0)//用于檢測按鍵
                {
                        delay(30);//設置延時消除,按鍵抖動
                        if(s1==0)
                        {
                               fx=0;
                                aa=0;ABC=0;
                                 if(fx==0)ABC=0;
                                TR0=0;
                                while(s1==0);
                        }
                }
                if(s2==0)//用于檢測按鍵
                {
                        delay(30);//設置延時消除,按鍵抖動
                        if(s2==0)
                        {
                                fx=~fx;//設置取反方向
                                TR0=0;
                                aa=0;
                                //使顯示的數據正向移動
                                if(fx==1)ABC=ZZ;//使顯示的數據反向移動
                                while(s2==0);//等待按鍵松手
                        }
                }
                for(i=0;i<16;i++)//設置循環移位
                {         
                        //兩片138組成4-16線譯碼器
                        P2=i;//設置列數據驅動,138的驅動端口
                        if(fx==0)writedata(tab[ABC+aa],tab[ABC+aa+1]);//設置想要顯示的數據
                        if(fx==1)writedata(tab1[ABC+aa],tab1[ABC+aa+1]);//設置想要顯示的數據
                        delay(3);//延時
                        writedata(0,0);//清屏
                        aa+=2;//數據加 實現掃描
                        if(aa>30)aa=0;//循環16次 清零
                }
        }
}

void timer0() interrupt 3
{
        TH0=(65536-10000)/256;//10.000ms   設置進入一次中斷
        TL0=(65536-10000)%256;
        TIME1++;
        if(TIME1==10)//設置到100.000ms時間加以實現移動,控制移動速度
        {
                TIME1=0;
                if(fx==0)//設置正向移動
                {
                        ABC=ABC+2;        //每次送兩個編碼數據
                        if(ABC>ZZ)//達到總字符
                        ABC=0;//數據清零
                }
                else//否則反向移動
                {
                        ABC=ABC-2;//設置每次送兩個編碼數據
                        if(ABC<2)//數據完畢
                        ABC=ZZ;//回到總字符
                }
        }
}


回復

使用道具 舉報

ID:837877 發表于 2020-11-19 13:04 | 顯示全部樓層
還有一個問題。如何讓正反在一組漢字中顯示,而不是分正反兩組
回復

使用道具 舉報

ID:267719 發表于 2020-11-20 14:18 | 顯示全部樓層
#include <reg51.h>
#include <string.h>
#include <intrins.h>



sbit shcp=P1^2;//數據輸入時鐘線 595的11腳
sbit stcp=P1^1;//輸出存儲器鎖存時鐘線 595的12腳
sbit ds=P1^0;//數據線  595的14腳


sbit s1=P3^1;//按下后會暫停,再按就會繼續
sbit s2=P3^2;//按下后顯示數字的傳送方向取反
unsigned char fx;//方向切換  0:停止 1:正向 2:反向
unsigned char TIME1;//設置數據移動定時時間
unsigned int ABC;//設置控制顯示的字符
unsigned char DD=0;//當前開始顯示的位置
unsigned int ZZ=4;//總字符
unsigned char displaybuf[32];//顯示緩存(1個中文字),和硬件對應
unsigned char code tab[]={
0x02,0x04,0x22,0x48,0x2A,0x52,0xA6,0x41,0x63,0xFE,0x26,0x40,0x2A,0x50,0x22,0x49,
0x00,0x06,0x3F,0xF8,0x22,0x00,0x22,0x00,0x23,0xFF,0x42,0x00,0x02,0x00,0x00,0x00,//顯示’新’字


0x04,0x20,0x08,0x20,0x10,0x20,0x3F,0xA0,0xC0,0x20,0x04,0x20,0x04,0x20,0x08,0xFF,
0xFE,0x20,0x11,0x20,0x11,0x20,0x21,0x20,0x41,0x20,0x07,0x20,0x00,0x20,0x00,0x00,//顯示‘華’字


0x02,0x20,0x0C,0x20,0x88,0x20,0x69,0x20,0x09,0x20,0x09,0x22,0x89,0x21,0x69,0x7E,
0x09,0x60,0x09,0xA0,0x19,0x20,0x28,0x20,0xC8,0x20,0x0A,0x20,0x0C,0x20,0x00,0x00,//顯示’學‘字


0x00,0x00,0x7F,0xFF,0x44,0x20,0x5A,0x10,0x61,0xE0,0x08,0x01,0x30,0x82,0x24,0x8C,
0x24,0xF0,0xA4,0x80,0x64,0x80,0x24,0xFC,0x24,0x82,0x28,0x82,0x30,0x8E,0x00,0x00,//顯示‘院‘字


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void delay(unsigned int dz)//設置延時子函數
{
   unsigned char x1;
   for(;dz>0;dz--)
   for(x1=231;x1>0;x1--);//for(x1=999;x1>0;x1--);        x1 為unsigned char 不能大于255         999實際等于231
}

/*此函數未修改*/
void writedata(unsigned char d1,unsigned char d2)         //設置595顯示子函數
{
        unsigned char i;
        //設置CY存儲移位之后的數據  設置CY進位標志位,單片機內部的寄存器,移位之后的數據保存在CY
        for(i=0;i<8;i++)//設置八次循環
        {
                d1=d1<<1;//令數據左移11110001
                                ds=CY;//設置發送數據
                shcp=1;//上升沿發生移位,數據寄存器的數據鎖存。
                shcp=0;
        }
        for(i=0;i<8;i++)//同樣設置八次循環
        {
                d2=d2<<1;//令數據左移
                                ds=CY;//設置發送數據
                shcp=1;//上升沿發生移位,數據寄存器的數據鎖存 。
                shcp=0;
        }
        stcp=0;      
        stcp=1;//上升沿將數據送到輸出鎖存器   
        stcp=0;
}


void main()
{
        char i;

                memcpy(displaybuf,tab,32);
        TMOD=0x01;//設置定時器0與模式1與16位定時模式
        TH0=(65536-10000)/256;//定時10.000ms
        TL0=(65536-10000)%256;
        ET0=1;//使能定時器0
        EA=1;//設置開啟總中斷
            TR0=1;//開始計數
        while(1)         //設置無限循環
        {
                if(s1==0)//用于檢測按鍵
                {
                        delay(30);//設置延時消除,按鍵抖動
                        if(s1==0)
                        {//按鍵被按下
                                                  if(fx==0) fx=1; else fx=0;
                          while(s1==0);
                        }
                }
                if(s2==0)//用于檢測按鍵
                {
                        delay(30);//設置延時消除,按鍵抖動
                        if(s2==0)
                        {
                                                  if(fx==0) fx=2; else fx=0;
                          while(s2==0);//等待按鍵松手
                        }
                }
                for(i=0;i<16;i++)//設置循環移位
                {         
                        //兩片138組成4-16線譯碼器
                        P2=i;//設置列數據驅動,138的驅動端口
                                                writedata(displaybuf[i*2],displaybuf[i*2+1]);//顯示緩存中內容
                        delay(3);//延時
                        writedata(0,0);//清屏
                }
        }
}


/*
void timer0() interrupt 1
{
        TH0=(65536-10000)/256;//10.000ms   設置進入一次中斷
        TL0=(65536-10000)%256;
        TIME1++;
        if(TIME1==10)//設置到100.000ms時間加以實現移動,控制移動速度
        {
                TIME1=0;
                                if (DD<=(ZZ-1)*16)
                                {        //未越界
                                        memcpy(displaybuf,&tab[DD*2],32);//將第n列開始搬入顯示緩存
                                }
                                else
                                {        //已越界
                                        memcpy(displaybuf,&tab[DD*2],(ZZ*16-DD)*2);//將全部字 尾部部分移入緩存前部
                                        memcpy(&displaybuf[(ZZ*16-DD)*2],tab,(16-(ZZ*16-DD))*2);//將全部字 頭部部分移入緩存后部
                                }               
                if(fx==1)//設置正向移動
                {
                                        DD++;//下一開始顯示列
                                        if (DD>=ZZ*16) DD=0; //越界,從頭開始顯示
                }
                else if(fx==2)//否則反向移動
                {
                                    if (DD==0) DD=ZZ*16-1; else DD--; //下一開始顯示列         越界,從尾開始顯示
                }
        }
}
*/

void timer0() interrupt 1
{
unsigned char j;
unsigned char k;
        TH0=(65536-10000)/256;//10.000ms   設置進入一次中斷
        TL0=(65536-10000)%256;
        TIME1++;
        if(TIME1==10)//設置到100.000ms時間加以實現移動,控制移動速度
        {
                TIME1=0;
                if(fx==1)//設置正向移動
                {
                                        if (DD<=(ZZ-1)*16)
                                        {
                                                memcpy(displaybuf,&tab[DD*2],32); //未越界,
                                        }
                                        else
                                        {
                                                memcpy(displaybuf,&tab[DD*2],(ZZ*16-DD)*2);
                                                memcpy(&displaybuf[(ZZ*16-DD)*2],tab,(16-(ZZ*16-DD))*2);
                                        }
                                        DD++;
                                        if (DD>=ZZ*16) DD=0;  //越界:超過總字數從0開始  超過15個中文請定義DD為unsigned int         因16*16=256 超出 unsigned char
                }
                else if(fx==2)//否則反向移動
                {
                                        j=DD%16;//倒數第幾列  0-15->15-0
                                        k=DD/16;//第幾個字          0..ZZ-1
                                        memcpy(displaybuf,&tab[(k*16+15-j)*2],j*2);
                                        if (k==0)
                                          {
                                             k=ZZ-1;
                                          }
                                          else
                                          {
                                             k--;
                                          }
                                        memcpy(&displaybuf[j*2],&tab[(k*16)*2],(16-j)*2);
                                        DD++;
                                        if (DD>=ZZ*16) DD=0;  //超過總字數從0開始  超過15個中文請定義DD為unsigned int
                }
        }
}

回復

使用道具 舉報

ID:837877 發表于 2020-11-21 13:03 | 顯示全部樓層
carpcarey 發表于 2020-11-20 14:18
#include
#include
#include

謝謝大哥!!!!但是,如何讓顯示的數變多
回復

使用道具 舉報

ID:367460 發表于 2020-11-21 16:34 | 顯示全部樓層
你可以說設置下字體大小,在取模軟件里
回復

使用道具 舉報

ID:267719 發表于 2020-11-23 11:23 | 顯示全部樓層
花開彼岸鍙哦 發表于 2020-11-21 13:03
謝謝大哥!!!!但是,如何讓顯示的數變多

緩存開大啊。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表