久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1743|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

求大神幫忙指導(dǎo)改改單片機74hc595按鍵程序

[復(fù)制鏈接]
回帖獎勵 250 黑幣 回復(fù)本帖可獲得 50 黑幣獎勵! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:837877 發(fā)表于 2020-11-19 10:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
需要s1按鍵為按一下正向移動在按一下暫停,s2為按一下反向移動在按一下暫停,找不到問題在哪里,暫停也不會在當(dāng)前進度暫停而是回到開始了。
#include<reg51.h>


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


sbit s1=P3^1;//按下后會暫停,再按就會繼續(xù)
sbit s2=P3^2;//按下后顯示數(shù)字的傳送方向取反
bit fx;//方向切換
unsigned char TIME1;//設(shè)置數(shù)據(jù)移動定時時間
unsigned int ABC;//設(shè)置控制顯示的字符
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,//顯示’學(xué)‘字


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,//顯示‘學(xué)’字


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


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

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:837877 發(fā)表于 2020-11-19 13:04 | 只看該作者
還有一個問題。如何讓正反在一組漢字中顯示,而不是分正反兩組
回復(fù)

使用道具 舉報

板凳
ID:267719 發(fā)表于 2020-11-20 14:18 | 只看該作者
#include <reg51.h>
#include <string.h>
#include <intrins.h>



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


sbit s1=P3^1;//按下后會暫停,再按就會繼續(xù)
sbit s2=P3^2;//按下后顯示數(shù)字的傳送方向取反
unsigned char fx;//方向切換  0:停止 1:正向 2:反向
unsigned char TIME1;//設(shè)置數(shù)據(jù)移動定時時間
unsigned int ABC;//設(shè)置控制顯示的字符
unsigned char DD=0;//當(dāng)前開始顯示的位置
unsigned int ZZ=4;//總字符
unsigned char displaybuf[32];//顯示緩存(1個中文字),和硬件對應(yīng)
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,//顯示’學(xué)‘字


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)//設(shè)置延時子函數(shù)
{
   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
}

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


void main()
{
        char i;

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


/*
void timer0() interrupt 1
{
        TH0=(65536-10000)/256;//10.000ms   設(shè)置進入一次中斷
        TL0=(65536-10000)%256;
        TIME1++;
        if(TIME1==10)//設(shè)置到100.000ms時間加以實現(xiàn)移動,控制移動速度
        {
                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)//設(shè)置正向移動
                {
                                        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   設(shè)置進入一次中斷
        TL0=(65536-10000)%256;
        TIME1++;
        if(TIME1==10)//設(shè)置到100.000ms時間加以實現(xiàn)移動,控制移動速度
        {
                TIME1=0;
                if(fx==1)//設(shè)置正向移動
                {
                                        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;  //越界:超過總字?jǐn)?shù)從0開始  超過15個中文請定義DD為unsigned int         因16*16=256 超出 unsigned char
                }
                else if(fx==2)//否則反向移動
                {
                                        j=DD%16;//倒數(shù)第幾列  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;  //超過總字?jǐn)?shù)從0開始  超過15個中文請定義DD為unsigned int
                }
        }
}

回復(fù)

使用道具 舉報

地板
ID:837877 發(fā)表于 2020-11-21 13:03 | 只看該作者
carpcarey 發(fā)表于 2020-11-20 14:18
#include
#include
#include

謝謝大哥。。!但是,如何讓顯示的數(shù)變多
回復(fù)

使用道具 舉報

5#
ID:367460 發(fā)表于 2020-11-21 16:34 | 只看該作者
你可以說設(shè)置下字體大小,在取模軟件里
回復(fù)

使用道具 舉報

6#
ID:267719 發(fā)表于 2020-11-23 11:23 | 只看該作者
花開彼岸鍙哦 發(fā)表于 2020-11-21 13:03
謝謝大哥!!!!但是,如何讓顯示的數(shù)變多

緩存開大啊。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产一区二区三区不卡 | 成人久久 | 国产精品亚洲一区二区三区在线 | 亚洲精品国产成人 | 欧美国产视频一区二区 | 麻豆a级片 | 手机在线不卡av | 国产精品美女久久久免费 | 精品不卡 | 中文字幕一区二区不卡 | 91看片在线 | 久久这里只有精品首页 | 亚洲一区二区三区观看 | 在线观看视频91 | 搞黄视频免费看 | 久久久国产一区二区三区四区小说 | 一级欧美 | 日本精品一区 | 中文字幕日韩在线观看 | 亚洲精品一二区 | 欧美日韩在线播放 | 视频在线观看一区二区 | 国产精品欧美一区二区 | 日韩一区二区在线视频 | 欧美日韩亚洲国产 | 成人国产一区二区三区精品麻豆 | 国产女人叫床高潮大片免费 | 免费一区二区三区 | 午夜国产| 成人精品一区亚洲午夜久久久 | 97精品国产一区二区三区 | 激情欧美日韩一区二区 | 亚洲一区二区国产 | 亚洲一区二区久久 | 日本成人三级电影 | av天天看| 欧美在线观看一区二区 | 国产成人精品一区二 | 福利社午夜影院 | 天堂网色 | 少妇精品久久久久久久久久 |