![]() |
發(fā)布時間: 2014-11-11 14:46
正文摘要:近期得到一塊16x64的LED屏幕板子,板子上的集成電路有,8塊74hc595、一塊74hc245,一塊74hc123,一塊74hc367、2塊hc74138.參考網(wǎng)上的接口定義和驅(qū)動,能夠點亮,但出現(xiàn)一下問題:只送一個字的數(shù)據(jù)時,第一個字顯示正 ... |
xing1234 發(fā)表于 2014-11-12 18:02 厲害啊,欣賞欣賞。謝謝 |
樓主的思路好啊。通過調(diào)整,把板子搞好了,值得借鑒。向樓主學習。 |
xing1234 發(fā)表于 2014-11-13 08:24 非常感謝你,經(jīng)過實驗,原來是板子上的74hc123工作不正常引起的,可能是我的程序達不到原來板子的刷新頻率,導致74hc123工作不正!,F(xiàn)在把板子上的74hc123去掉,把一塊138的6腳接vcc,另一塊138的4腳接地,讓138正常工作,顯示就正常了。 |
ICi是STC5608,晶振18。432 |
需要審核所,我以為沒發(fā)得起,反復發(fā)了幾次, 這程序是以前的,很多對你沒什么用,比如EEP串口通信等,當時編得不是很好,你取你需要的部分就成 |
#include <STC12C54.H> #include <intrins.h> #include <absacc.h> #include <math.h> #define unchar unsigned char #define unint unsigned int /*****************關(guān)鍵值*********************/ //COM通信修改項 #define COM_ADDRES_G 0x00 //廣播通信地址16進制 #define com_in_data0 0xBE // 接收開始位 #define com_in_close 0x0D // 接收結(jié)束位 //新舊屏修改項 //#define EN_on 1 //掃描開 //0 新舊屏相關(guān) //電信舊屏為0 //熊屏為1 #define EN_off !EN_on //掃描 //1 //改屏字數(shù)時修改項 #define PIN_ZI 5 //屏總字數(shù) //4 #define RAM_SHU 32*(PIN_ZI/2) //緩沖數(shù)組大小int //32*(PIN_ZI/2) #define H2_ZI 4 //第二行字中數(shù)字加入到第幾個字中間 #define ZHI_HH 17 //數(shù)據(jù)行數(shù) //4 #define COM_MAX 77 //com最大接收數(shù) #define XIAN_id 13 //窗口號放在第幾行 /****************函數(shù)申明區(qū)************************************/ //sfr AUXR = 0x8e; void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL); unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL); void IAP_CACHU (unsigned char ADDH,unsigned char ADDL); void INSZ8(void); void com_out(void); unsigned char hextoasc(unsigned char ascc); //輸入hex碼值,輸出 ascii碼 unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL); //輸出hex碼值,輸入 ascii碼 void CHU_SHI(void); /* ISP_IAP_寄存器 */ sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7; //IO端口定義 sbit AA = P1^0; sbit BB = P1^1; sbit CC = P1^2; sbit EN = P1^4; //34 sbit DD = P1^3; sbit R1_DAT = P1^5; //33 sbit ST_RCK = P1^6; //1.6 C5 sbit CK_CLK = P1^7; //1.7 sbit LED = P3^5; // P3^5; sbit K2_A = P3^2; sbit K3_B = P3^4; //---------------------------- sbit IN_1 = P3^7; //sbit RE = P3^5; //485發(fā)送控制 //sbit LED = P3^7; //全局變量定義 unchar da_H; //顯示掃描行數(shù) unsigned int xdata ZHUO_DA; unchar zi; //左移字數(shù)累加 unsigned int xdata DAT_RAM2[RAM_SHU]; //顯示掃描緩沖區(qū) unsigned char com_i; //5/26 bit com_q; unsigned char data COM_R[COM_MAX]; //接收數(shù)據(jù)緩存 //77 bit COM_OK; //寫入數(shù)據(jù)完成標志位 bit Zhi_b; //寫入數(shù)據(jù)完成標志位 unsigned char idata H_ZHI[16]; //每行字數(shù) unsigned char Zhi_h,chisu; //當前顯示字區(qū) unsigned char YI_F; //移動方向選取 unsigned char idata COM_DATA[6],COM_ADDRES; // 4 unsigned int PAI; //排隊等候時間 unsigned char QIE; //切換時間 bit Zhi_ZHI; //字移完成標志位 unsigned char Z_H ; //字數(shù)最大行數(shù) unsigned char Z_LMAX ; // Z_LMAX=PIN_ZI*2 //掃描字數(shù)移位確認 unsigned char SHU_1_14; //上移綬沖開始位 unsigned int time_s; bit EN_on; // 輸出EN驅(qū)動反向控制位 bit PIN_ADD_b; //屏地址更改標志位 bit S1_b,S2_b,S3_b,in_b,hl_b; //按鍵狀態(tài)標志位 unsigned char IN_HL; //輸入數(shù)據(jù)高電平/低電平有效 unsigned char IN_time; //bit ddd; //叫號閃爍時間清零標志 unsigned char xdata YI_DONG_SD[15] ; //移動速度 unsigned char xdata YI_DONG_FX[15] ; //移動方向選取 unsigned char xdata XIAN_SI_YS[15] ; //顯示延時 unsigned char xdata JIAO_HAO_1[15] ; //叫號1 unsigned char xdata JIAO_HAO_X[15] ; //叫號顯示與否標志位 unsigned char xdata XIAN_SI_CS[15] ; //顯示次數(shù) unsigned char xdata TING_LUI_SJ[15] ; //停留時間 unsigned char xdata JIAO_HAO_CS[15] ; //叫號閃動次數(shù) //unsigned int H1_wwww ; //第一行字中數(shù)字加入到第幾個字中間 // unsigned char COM_EN; //unsigned char time_d ; //unsigned int xdata DAT_XIAN_ID[17]; //窗口號顯示掃描緩沖區(qū) unsigned char code Dat_pin[]= {//橫向取模左高位,數(shù)據(jù)排列:從左到右從上到下 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0- 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1- 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2- 0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4- 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7- 0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9- 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE, // -A- 0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66, // -B- 0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0, // -C- 0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, 0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66, // -D- 0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -E- 0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -F- 0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // --- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; |
一次發(fā)不了太多 |
/*版 本: 1.0 */ #include <STC12C54.H> #include <intrins.h> #include <absacc.h> #include <math.h> #define unchar unsigned char #define unint unsigned int /*****************關(guān)鍵值*********************/ //COM通信修改項 #define COM_ADDRES_G 0x00 //廣播通信地址16進制 #define com_in_data0 0xBE // 接收開始位 #define com_in_close 0x0D // 接收結(jié)束位 //新舊屏修改項 //#define EN_on 1 //掃描開 //0 新舊屏相關(guān) //電信舊屏為0 //熊屏為1 #define EN_off !EN_on //掃描 //1 //改屏字數(shù)時修改項 #define PIN_ZI 5 //屏總字數(shù) //4 #define RAM_SHU 32*(PIN_ZI/2) //緩沖數(shù)組大小int //32*(PIN_ZI/2) #define H2_ZI 4 //第二行字中數(shù)字加入到第幾個字中間 #define ZHI_HH 17 //數(shù)據(jù)行數(shù) //4 #define COM_MAX 77 //com最大接收數(shù) #define XIAN_id 13 //窗口號放在第幾行 /****************函數(shù)申明區(qū)************************************/ //sfr AUXR = 0x8e; void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL); unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL); void IAP_CACHU (unsigned char ADDH,unsigned char ADDL); void INSZ8(void); void com_out(void); unsigned char hextoasc(unsigned char ascc); //輸入hex碼值,輸出 ascii碼 unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL); //輸出hex碼值,輸入 ascii碼 void CHU_SHI(void); /* ISP_IAP_寄存器 */ sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7; //IO端口定義 sbit AA = P1^0; sbit BB = P1^1; sbit CC = P1^2; sbit EN = P1^4; //34 sbit DD = P1^3; sbit R1_DAT = P1^5; //33 sbit ST_RCK = P1^6; //1.6 C5 sbit CK_CLK = P1^7; //1.7 sbit LED = P3^5; // P3^5; sbit K2_A = P3^2; sbit K3_B = P3^4; //---------------------------- sbit IN_1 = P3^7; //sbit RE = P3^5; //485發(fā)送控制 //sbit LED = P3^7; //全局變量定義 unchar da_H; //顯示掃描行數(shù) unsigned int xdata ZHUO_DA; unchar zi; //左移字數(shù)累加 unsigned int xdata DAT_RAM2[RAM_SHU]; //顯示掃描緩沖區(qū) unsigned char com_i; //5/26 bit com_q; unsigned char data COM_R[COM_MAX]; //接收數(shù)據(jù)緩存 //77 bit COM_OK; //寫入數(shù)據(jù)完成標志位 bit Zhi_b; //寫入數(shù)據(jù)完成標志位 unsigned char idata H_ZHI[16]; //每行字數(shù) unsigned char Zhi_h,chisu; //當前顯示字區(qū) unsigned char YI_F; //移動方向選取 unsigned char idata COM_DATA[6],COM_ADDRES; // 4 unsigned int PAI; //排隊等候時間 unsigned char QIE; //切換時間 bit Zhi_ZHI; //字移完成標志位 unsigned char Z_H ; //字數(shù)最大行數(shù) unsigned char Z_LMAX ; // Z_LMAX=PIN_ZI*2 //掃描字數(shù)移位確認 unsigned char SHU_1_14; //上移綬沖開始位 unsigned int time_s; bit EN_on; // 輸出EN驅(qū)動反向控制位 bit PIN_ADD_b; //屏地址更改標志位 bit S1_b,S2_b,S3_b,in_b,hl_b; //按鍵狀態(tài)標志位 unsigned char IN_HL; //輸入數(shù)據(jù)高電平/低電平有效 unsigned char IN_time; //bit ddd; //叫號閃爍時間清零標志 unsigned char xdata YI_DONG_SD[15] ; //移動速度 unsigned char xdata YI_DONG_FX[15] ; //移動方向選取 unsigned char xdata XIAN_SI_YS[15] ; //顯示延時 unsigned char xdata JIAO_HAO_1[15] ; //叫號1 unsigned char xdata JIAO_HAO_X[15] ; //叫號顯示與否標志位 unsigned char xdata XIAN_SI_CS[15] ; //顯示次數(shù) unsigned char xdata TING_LUI_SJ[15] ; //停留時間 unsigned char xdata JIAO_HAO_CS[15] ; //叫號閃動次數(shù) //unsigned int H1_wwww ; //第一行字中數(shù)字加入到第幾個字中間 // unsigned char COM_EN; //unsigned char time_d ; //unsigned int xdata DAT_XIAN_ID[17]; //窗口號顯示掃描緩沖區(qū) unsigned char code Dat_pin[]= {//橫向取模左高位,數(shù)據(jù)排列:從左到右從上到下 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0- 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1- 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2- 0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4- 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7- 0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9- 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE, // -A- 0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66, // -B- 0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0, // -C- 0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, 0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66, // -D- 0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -E- 0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -F- 0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // --- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; /****************中斷處理程序區(qū)**************************************/ void extern0_ISR() interrupt 0 {} void timer0_ISR () interrupt 1 { unchar i,j,k; //12M 1.5MS中斷一次 unint da_k; TL0 = 0x78; TH0 = 0xfa; TR0 = 0; // EA = 0; TF0 = 0; //time0中斷請求標志位 if(da_H>15) da_H=0; j=da_H*PIN_ZI; for (k=0;k<PIN_ZI;k++) //12 { da_k=DAT_RAM2[j+k]; for (i=0;i<16;i++) { if(da_k&0x8000) R1_DAT = 0; else R1_DAT = 1; _nop_(); CK_CLK = 1; _nop_(); CK_CLK = 0; da_k<<=1; } } EN =EN_off; //0 if(da_H>7) { DD=1; } else { DD=0; } if(da_H&0x01) AA=1; else AA=0; if(da_H&0x02) BB=1; else BB=0; if(da_H&0x04) CC=1; else CC=0; ST_RCK = 1; EN =EN_on; ST_RCK = 0; R1_DAT = 0; da_H++; //行加 TR0 = 1; // EA = 1; time_s++; } //通信中斷 void serial_ISR () interrupt 4 { unsigned char i,SBUF_lcd; if(RI==1) { SBUF_lcd = SBUF; if(SBUF_lcd==com_in_close) //接收結(jié)束位 { i=ASC_TO_HEX(COM_R[0],COM_R[1]); if((i==COM_ADDRES_G)||(i==COM_ADDRES)) com_out(); //寫屏 for(i=0;i<com_i;i++) COM_R[i]=0; SBUF_lcd=0; com_i=0; com_q=0; } if(com_q) { COM_R[com_i]=SBUF_lcd; if(com_i<COM_MAX) com_i++; } if(SBUF_lcd==com_in_data0) //接收開始位 { com_q=1; com_i=0; } } RI=0; } void timer2_ISR () interrupt 5{} /* not used */ unsigned char hextoasc(unsigned char ascc) //輸入hex碼值,輸出 ascii碼 { if(ascc>47&&ascc<58) return (ascc-48); // if(ascc>64&&ascc<71) if(ascc>64&&ascc<92) return (ascc-55); } unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL) //輸出hex碼值,輸入 ascii碼 { unsigned char da; da=hextoasc(ascH); da<<=4; da|=hextoasc(ascL); return da; } void shuzhu (unchar z,unchar h) { unsigned char i; unsigned int b; b=z*32; if(z>H_ZHI[h]) H_ZHI[h]=z; h++; if(h>13) h=13; if(COM_EN) { for(i=0;i<32;i++) { if(b<256) IAP_XIE (COM_R[i],h,b) ; b++; } } } void chan_shu(unchar pp,unchar ma,unchar da) { unchar i; if(COM_EN) { if(pp<6) { i=pp*20; i+=ma; IAP_XIE (da,0x0e,i) ; } else { pp-=6; i=pp*20; i+=ma; IAP_XIE (da,0x0f,i) ; } } } //數(shù)據(jù)接收處理 void com_out(void ) { unsigned char i,h,z,an,chao_zi,pp; unsigned int com_k; unsigned char com_x; z=ASC_TO_HEX(COM_R[6],COM_R[7]); h=ASC_TO_HEX(COM_R[4],COM_R[5]); chao_zi=ASC_TO_HEX(COM_R[2],COM_R[3]); if(chao_zi==0x04||chao_zi==0x05) { com_x=ASC_TO_HEX(COM_R[com_i-2],COM_R[com_i-1]); com_k=0; for(i=0;i<com_i-2;i++) { com_k+=ASC_TO_HEX(COM_R[i],COM_R[i+1]); i++; } com_k%=0xff; if(com_x!=com_k) return ; } if(chao_zi==0x04) //操作碼清EEP //操作碼1寫屏 { //if(h==0) if(!h&&(com_i==10||com_i==12)) //=0 { COM_EN=1; EN =EN_off; TR0 = 0; ET0=0; //time0中斷允許控制位 for(i=0;i<13;i++) //5608eep為0x00--0x0F 共4K { IAP_CACHU (i,0); //清空EEP i++; } for(i=0;i<ZHI_HH;i++) H_ZHI[i]=0; } else // if(h==1) // if(h==1&&(com_i==8||com_i==12)) { for(i=0;i<ZHI_HH;i++) { IAP_XIE (H_ZHI[i],0x0d,210+i) ; } } } else if(chao_zi==0x01) //操作碼清EEP //操作碼1寫屏 { if(com_i<60) { for(i=8;i<72;i++) COM_R[i]= 0x00; } an=0 ; for(i=8;i<72;i++) { COM_R[an]= ASC_TO_HEX(COM_R[i],COM_R[i+1]); i++; an++; } if(h>Z_H) Z_H = h ; //字數(shù)最大行數(shù) shuzhu (z,h) ; //寫入數(shù)據(jù) } else if(chao_zi==0x05) //操作碼清EEP //操作碼1寫屏 { if(!h&&com_i==12) //=0 { EN =EN_off; COM_EN=1; TR0 = 0; ET0=0; //time0中斷允許控制位 IAP_CACHU (0x0f,0); //清空EEP PIN_ADD_b=1; //屏地址更改標志位 } else if(h==1&&com_i==12) { COM_OK=1; //寫入數(shù)據(jù)完成標志位 COM_EN=0; } } else if(chao_zi==0x03) //操作碼參數(shù)設(shè)置 { // H1_wwww=0; if(h==4&&PIN_ADD_b) //寫入屏地址 PIN_ADD_b=0; //屏地址更改標志位 { z=ASC_TO_HEX(COM_R[6],COM_R[7]); IAP_XIE (z,0x0F,250) ; COM_ADDRES= IAP_DU (0x0f,250); PIN_ADD_b=0; //屏地址更改標志位 } else if(COM_EN) //寫入屏地址 { if(h==0x0d) //寫入屏地址 { z=ASC_TO_HEX(COM_R[6],COM_R[7]); IAP_XIE (z,0x0F,251) ; } else { pp=ASC_TO_HEX(COM_R[8],COM_R[9]); chan_shu(pp,h,z) ; } } } INSZ8(); } void IAP_FUWEI (void) { ISP_CONTR=0x00; ISP_CMD=0x00; ISP_TRIG=0x00; ISP_ADDRH=0xff; ISP_ADDRL=0xff; //ISP_DATA=0xff; } /*讀*/ unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_CMD=0x01; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); return ISP_DATA; } /*寫*/ void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_DATA=IAP_DATA; ISP_CMD=0x02; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); } /*擦除*/ void IAP_CACHU (unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_CMD=0x03; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); } /*****************延遲DELAY******************** **/ void delay(unsigned int a) //1-50ms /24M { unsigned int i; for(;a>0;a--) for(i=0;i<9988;i++) WDT_CONTR = 0x3C; //狗;; } void XIE_RAM2 (unchar zhi_ju,unchar DAT_R,unchar di,bit a) { unsigned char shuzhu,dat_i,i,ADDH,w; unsigned int k,da_k; di=0; if(zi>=DAT_R) { Zhi_ZHI=1; return ; } i=0; ADDH = zhi_ju; //取扇區(qū)地址 for(dat_i=0;dat_i<16;dat_i++) { for(shuzhu=0;shuzhu<PIN_ZI;shuzhu++) // PIN_ZI { if(a) { if(shuzhu==di) { k=(COM_DATA[0]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[1]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } else if(shuzhu==di+1) { k=(COM_DATA[2]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[3]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } else if(shuzhu==di+2) { k=(COM_DATA[4]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[5]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } /* else if(shuzhu==4) { DAT_RAM2[i]=0; i++; } */ else goto xei_2; } else { xei_2: da_k=shuzhu*32; k= dat_i+dat_i+da_k; // if(k<256) { DAT_RAM2[i]=IAP_DU (ADDH,k); } else { w=k-256; DAT_RAM2[i]=IAP_DU (ADDH+1,w); } DAT_RAM2[i]<<=8; k++; if(k<256) { DAT_RAM2[i]|=IAP_DU (ADDH,k); } else { w=k-256; DAT_RAM2[i]|=IAP_DU (ADDH+1,w); } i++; //字總數(shù)0-3 總計4個字 } } } // zi+=4; } QING_RAM2() { unsigned char dat_i; for(dat_i=0;dat_i<RAM_SHU;dat_i++) DAT_RAM2[dat_i]=0; // for(dat_i=0;dat_i<16;dat_i++) // DAT_XIAN_ID[dat_i]=0; } //開啟顯示定時掃描 void dingsi(void) { TMOD |= 0x01; TH0 = 0xF8; TL0 = 0x2f; ET0=1; TR0=1; EA=1; PT0=1; //優(yōu)先級 } //程序初始化 void CHU_SHI(void) { unsigned char i,z,an; EN =EN_off; //關(guān)顯示屏 dingsi(); //開啟顯示掃描定時 QING_RAM2(); //清顯示緩沖區(qū)RAM2內(nèi)存 delay(10); //開機延遲 COM_OK=0; //寫入數(shù)據(jù)完成標志位清零 Zhi_h=0; //當前顯示字區(qū)默認為0 Zhi_b=0; //調(diào)用顯示標志位清零 COM_ADDRES=IAP_DU (0x0f,250); //本機地址 z= IAP_DU (0x0f,251); // if(z) EN_on=1; //顯示屏亮度--1----------------------------------------------------------- // else // EN_on=0; for(i=0;i<14;i++) { if(i<6) { z=i*20; an=0x0e; } else { z=(i-6)*20; an=0x0f; } } Z_LMAX=PIN_ZI*2; SHU_1_14=RAM_SHU-PIN_ZI; } void chunchu_A( sw,sb,sg,add1) { IAP_CACHU (add1,0); //清空EEP 3扇區(qū) IAP_XIE (sw,add1,200) ; IAP_XIE (sb,add1,201) ; IAP_XIE (sg,add1,202) ; } unsigned char jp(unsigned char an) { unsigned char i; switch(an) { case 2: //K2_A組 WDT_CONTR = 0x3C; //狗;; if(S2_b==0) //K2_A { EXIT1 : if(K2_A==0) { for(i=0;i<100;i++) ; if(K2_A!=0) goto EXIT1; S2_b=1; return 1; } } else { if(K2_A==1) { S2_b=0; return 0; } } break; case 3: //K3_B組 if(S3_b==0) { EXIT2 : if(K3_B==0) { for(i=0;i<100;i++) ; if(K3_B!=0) goto EXIT2; S3_b=1; return 1; } } else { if(K3_B==1) { S3_b=0; return 0; } } break; } } unsigned char jp5S(unsigned char an) { unsigned char n; unsigned int i; switch(an) { case 2: //K2_A組 按紐2清除A/B組數(shù)據(jù) WDT_CONTR = 0x3C; //狗;; if(S2_b==0) //K2_A 按紐2清除A/B組數(shù)據(jù) { EXIT21 : if(K2_A==0) { for(n=0;n<5;n++) { for(i=0;i<6000;i++) ; delay(36); //延遲 // WDT_CONTR = 0x3C; //狗;; if(K2_A!=0) goto EXIT21; for(i=0;i<6000;i++) ; delay(36); //延遲 if(K2_A!=0) goto EXIT21; for(i=0;i<6000;i++) ; delay(36); //延遲 if(K2_A!=0) goto EXIT21; } for(i=0;i<100;i++) ; if(K2_A!=0) goto EXIT21; S2_b=1; return 1; } } else { if(K2_A==1) { S2_b=0; return 0; } } break; case 3: //K3_B組 if(S3_b==0) { EXIT32 : if(K3_B==0) { for(n=0;n<5;n++) { for(i=0;i<6000;i++) ; delay(36); //延遲 if(K3_B!=0) goto EXIT32; for(i=0;i<6000;i++) ; delay(36); //延遲 if(K3_B!=0) goto EXIT32; for(i=0;i<6000;i++) ; delay(36); //延遲 if(K3_B!=0) goto EXIT32; } S3_b=1; return 1; } } else { if(K3_B==1) { S3_b=0; return 0; } } break; } } void set_IN_HL(void) { unsigned char i,w,bei; w= IAP_DU (0x0A,204); bei=w; if(w>0) w=1; COM_DATA[0] =12; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 for(i=0;i<50;i++) { if(jp(3)==1) { w=!w; COM_DATA[0] =12; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 } delay(20) ; } delay(200) ; if(bei!=w) { QING_RAM2(); //清顯示緩沖區(qū)RAM2內(nèi)存 delay(10) ; IAP_CACHU (0x0A,0); //清空EEP 3扇區(qū) IAP_XIE (w,0x0A,204) ; } } void set_IN_time(void) { unsigned char i,w,bei; w= IAP_DU (0x0c,204); bei=w; // if(w>0) // w=1; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 for(i=0;i<100;i++) { if(jp(3)==1) { w++; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 } else if(jp(2)==1) { w--; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 } delay(20) ; } delay(200) ; QING_RAM2(); //清顯示緩沖區(qū)RAM2內(nèi)存 delay(10) ; IAP_CACHU (0x0c,0); //清空EEP 3扇區(qū) IAP_XIE (w,0x0c,204) ; } unsigned char IN_j(void) { unsigned int i; if(in_b==0) { EXIT3 : WDT_CONTR = 0x3C; //狗;; if(IN_1==hl_b) { for(i=0;i<6000;i++) ; delay(IN_time); //延遲 if(IN_1!=hl_b) goto EXIT3; if(IN_1==hl_b) for(i=0;i<6000;i++) ; delay(IN_time); //開機延遲 if(IN_1!=hl_b) goto EXIT3; in_b=1; return 1; } } else { if(IN_1!=hl_b) { in_b=0; return 0; } } } void xianshi(unchar a0,unchar a1,unchar a2,unchar a3,unchar a4 ) { COM_DATA[1]=a0 ; COM_DATA[2]=a1 ; COM_DATA[3]=a2 ; COM_DATA[4]=a3; COM_DATA[5]=a4 ; COM_DATA[0]=16 ; XIE_RAM2(Zhi_h+1,H_ZHI[Zhi_h],JIAO_HAO_1[Zhi_h],JIAO_HAO_1[Zhi_h]); // XIE_RAM2(1,16,0,1); //顯示當前A值 } /********************8位接收設(shè)置**********************/ void INSZ8(void) { SCON = 0x50; // 晶振18.432M PCON |=0x80; TMOD |= 0X20; TMOD &= 0XEF; TH1 = 0XF6; //9600 晶振18.432M TL1 = 0xf6; TR1=1; IE |= 0x90; // RE = 0; } // /*****************主程序區(qū)****************************/ void main(void) { unsigned char idata i,ab_ch; unsigned int idata time_f; unsigned char idata ucdata_B[3]; bit A_B,time_bit,ab_b; delay(1); //開機延遲 dingsi(); //開啟顯示掃描定時 zi=0; Zhi_ZHI=0; time_s=0; da_H=0;//行掃開始值 CHU_SHI(); //初始化 INSZ8(); //開啟串口接收 18.432M-19200--------------- if(jp5S(3)==1) set_IN_HL() ; // 輸入端高低電平有效位設(shè)置 if(jp5S(2)==1) set_IN_time() ; time_bit=0 ; //是否有數(shù)據(jù)需要保存標志位 A_B=0; //顯示A/B組標志位 IN_HL= IAP_DU (0x0A,204); //讀出輸入端高低電平為有效位 IN_time= IAP_DU (0x0c,204); if(IN_time>200) { IN_time=5; IAP_CACHU (0x0c,0); //清空EEP 3扇區(qū) IAP_XIE (IN_time,0x0c,204) ; } if(IN_HL>0) hl_b=0; else hl_b=1; in_b=1; //防止誤動作 xianshi(10,11,16,16,16 ) ; //B delay(100) ; i=IAP_DU (0x04,200); if(i>99) ucdata_B[0]=0; else ucdata_B[0]= i ; i=IAP_DU (0x04,201); if(i>99) ucdata_B[1]=0; else ucdata_B[1]= i ; i=IAP_DU (0x04,202); if(i>99) ucdata_B[2]=0; else ucdata_B[2]= i ; xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B /* delay(200) ; xianshi(10,16,16,16,16 ) ; //A delay(200) ; i=IAP_DU (0x03,200); if(i>99) ucdata[0]=0; else ucdata[0]= i ; i=IAP_DU (0x03,201); if(i>99) ucdata[1]=0; else ucdata[1]= i ; i=IAP_DU (0x03,202); if(i>99) ucdata[2]=0; else ucdata[2]= i ; */ // xianshi(ucdata[2]%10,ucdata[1]/10,ucdata[1]%10,ucdata[0]/10,ucdata[0]%10 ) ; //顯示當前A值 while(1) { open: WDT_CONTR = 0x3C; //狗; delay(1) ; i=1; for(i=0;i<3;i++); if(IN_j()==1) //有數(shù)據(jù)輸入 { if(ucdata_B[0]>=99) { ucdata_B[0]=0; if(ucdata_B[1]>=99) { ucdata_B[1]=0; if(ucdata_B[2]>=99) ucdata_B[2]=0; else ucdata_B[2]++; } else ucdata_B[1]++; } else ucdata_B[0]++; xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B time_f=0; time_s=0; time_bit=1; ab_b=0; } if(time_s>60000&&time_bit) { time_f++; time_s=0; if(time_f>5) // { time_bit=0; time_f=0; chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); } } if(jp5S(3)==1)//按紐3顯示B組數(shù)據(jù) { xianshi(11,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B ab_b=1; ab_ch=0; } else { if(ab_b) { ab_ch++; if(ab_ch>100) { chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B ab_b=0; } } } if(jp5S(2)==1)//按紐2清除A/B組數(shù)據(jù) { ucdata_B[0]=0; ucdata_B[1]=0; ucdata_B[2]=0; QING_RAM2(); //清顯示緩沖區(qū)RAM2內(nèi)存 delay(10) ; chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B } goto open; } } /* 程序完成時間: */ |
/*版 本: 1.0 */ #include <STC12C54.H> #include <intrins.h> #include <absacc.h> #include <math.h> #define unchar unsigned char #define unint unsigned int /*****************關(guān)鍵值*********************/ //COM通信修改項 #define COM_ADDRES_G 0x00 //廣播通信地址16進制 #define com_in_data0 0xBE // 接收開始位 #define com_in_close 0x0D // 接收結(jié)束位 //新舊屏修改項 //#define EN_on 1 //掃描開 //0 新舊屏相關(guān) //電信舊屏為0 //熊屏為1 #define EN_off !EN_on //掃描 //1 //改屏字數(shù)時修改項 #define PIN_ZI 5 //屏總字數(shù) //4 #define RAM_SHU 32*(PIN_ZI/2) //緩沖數(shù)組大小int //32*(PIN_ZI/2) #define H2_ZI 4 //第二行字中數(shù)字加入到第幾個字中間 #define ZHI_HH 17 //數(shù)據(jù)行數(shù) //4 #define COM_MAX 77 //com最大接收數(shù) #define XIAN_id 13 //窗口號放在第幾行 /****************函數(shù)申明區(qū)************************************/ //sfr AUXR = 0x8e; void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL); unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL); void IAP_CACHU (unsigned char ADDH,unsigned char ADDL); void INSZ8(void); void com_out(void); unsigned char hextoasc(unsigned char ascc); //輸入hex碼值,輸出 ascii碼 unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL); //輸出hex碼值,輸入 ascii碼 void CHU_SHI(void); /* ISP_IAP_寄存器 */ sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7; //IO端口定義 sbit AA = P1^0; sbit BB = P1^1; sbit CC = P1^2; sbit EN = P1^4; //34 sbit DD = P1^3; sbit R1_DAT = P1^5; //33 sbit ST_RCK = P1^6; //1.6 C5 sbit CK_CLK = P1^7; //1.7 sbit LED = P3^5; // P3^5; sbit K2_A = P3^2; sbit K3_B = P3^4; //---------------------------- sbit IN_1 = P3^7; //sbit RE = P3^5; //485發(fā)送控制 //sbit LED = P3^7; //全局變量定義 unchar da_H; //顯示掃描行數(shù) unsigned int xdata ZHUO_DA; unchar zi; //左移字數(shù)累加 unsigned int xdata DAT_RAM2[RAM_SHU]; //顯示掃描緩沖區(qū) unsigned char com_i; //5/26 bit com_q; unsigned char data COM_R[COM_MAX]; //接收數(shù)據(jù)緩存 //77 bit COM_OK; //寫入數(shù)據(jù)完成標志位 bit Zhi_b; //寫入數(shù)據(jù)完成標志位 unsigned char idata H_ZHI[16]; //每行字數(shù) unsigned char Zhi_h,chisu; //當前顯示字區(qū) unsigned char YI_F; //移動方向選取 unsigned char idata COM_DATA[6],COM_ADDRES; // 4 unsigned int PAI; //排隊等候時間 unsigned char QIE; //切換時間 bit Zhi_ZHI; //字移完成標志位 unsigned char Z_H ; //字數(shù)最大行數(shù) unsigned char Z_LMAX ; // Z_LMAX=PIN_ZI*2 //掃描字數(shù)移位確認 unsigned char SHU_1_14; //上移綬沖開始位 unsigned int time_s; bit EN_on; // 輸出EN驅(qū)動反向控制位 bit PIN_ADD_b; //屏地址更改標志位 bit S1_b,S2_b,S3_b,in_b,hl_b; //按鍵狀態(tài)標志位 unsigned char IN_HL; //輸入數(shù)據(jù)高電平/低電平有效 unsigned char IN_time; //bit ddd; //叫號閃爍時間清零標志 unsigned char xdata YI_DONG_SD[15] ; //移動速度 unsigned char xdata YI_DONG_FX[15] ; //移動方向選取 unsigned char xdata XIAN_SI_YS[15] ; //顯示延時 unsigned char xdata JIAO_HAO_1[15] ; //叫號1 unsigned char xdata JIAO_HAO_X[15] ; //叫號顯示與否標志位 unsigned char xdata XIAN_SI_CS[15] ; //顯示次數(shù) unsigned char xdata TING_LUI_SJ[15] ; //停留時間 unsigned char xdata JIAO_HAO_CS[15] ; //叫號閃動次數(shù) //unsigned int H1_wwww ; //第一行字中數(shù)字加入到第幾個字中間 // unsigned char COM_EN; //unsigned char time_d ; //unsigned int xdata DAT_XIAN_ID[17]; //窗口號顯示掃描緩沖區(qū) unsigned char code Dat_pin[]= {//橫向取模左高位,數(shù)據(jù)排列:從左到右從上到下 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0- 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1- 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2- 0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4- 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7- 0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9- 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE, // -A- 0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, 0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66, // -B- 0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, 0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0, // -C- 0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, 0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66, // -D- 0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -E- 0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -F- 0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // --- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; /****************中斷處理程序區(qū)**************************************/ void extern0_ISR() interrupt 0 {} void timer0_ISR () interrupt 1 { unchar i,j,k; //12M 1.5MS中斷一次 unint da_k; TL0 = 0x78; TH0 = 0xfa; TR0 = 0; // EA = 0; TF0 = 0; //time0中斷請求標志位 if(da_H>15) da_H=0; j=da_H*PIN_ZI; for (k=0;k<PIN_ZI;k++) //12 { da_k=DAT_RAM2[j+k]; for (i=0;i<16;i++) { if(da_k&0x8000) R1_DAT = 0; else R1_DAT = 1; _nop_(); CK_CLK = 1; _nop_(); CK_CLK = 0; da_k<<=1; } } EN =EN_off; //0 if(da_H>7) { DD=1; } else { DD=0; } if(da_H&0x01) AA=1; else AA=0; if(da_H&0x02) BB=1; else BB=0; if(da_H&0x04) CC=1; else CC=0; ST_RCK = 1; EN =EN_on; ST_RCK = 0; R1_DAT = 0; da_H++; //行加 TR0 = 1; // EA = 1; time_s++; } //通信中斷 void serial_ISR () interrupt 4 { unsigned char i,SBUF_lcd; if(RI==1) { SBUF_lcd = SBUF; if(SBUF_lcd==com_in_close) //接收結(jié)束位 { i=ASC_TO_HEX(COM_R[0],COM_R[1]); if((i==COM_ADDRES_G)||(i==COM_ADDRES)) com_out(); //寫屏 for(i=0;i<com_i;i++) COM_R[i]=0; SBUF_lcd=0; com_i=0; com_q=0; } if(com_q) { COM_R[com_i]=SBUF_lcd; if(com_i<COM_MAX) com_i++; } if(SBUF_lcd==com_in_data0) //接收開始位 { com_q=1; com_i=0; } } RI=0; } void timer2_ISR () interrupt 5{} /* not used */ unsigned char hextoasc(unsigned char ascc) //輸入hex碼值,輸出 ascii碼 { if(ascc>47&&ascc<58) return (ascc-48); // if(ascc>64&&ascc<71) if(ascc>64&&ascc<92) return (ascc-55); } unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL) //輸出hex碼值,輸入 ascii碼 { unsigned char da; da=hextoasc(ascH); da<<=4; da|=hextoasc(ascL); return da; } void shuzhu (unchar z,unchar h) { unsigned char i; unsigned int b; b=z*32; if(z>H_ZHI[h]) H_ZHI[h]=z; h++; if(h>13) h=13; if(COM_EN) { for(i=0;i<32;i++) { if(b<256) IAP_XIE (COM_R[i],h,b) ; b++; } } } void chan_shu(unchar pp,unchar ma,unchar da) { unchar i; if(COM_EN) { if(pp<6) { i=pp*20; i+=ma; IAP_XIE (da,0x0e,i) ; } else { pp-=6; i=pp*20; i+=ma; IAP_XIE (da,0x0f,i) ; } } } //數(shù)據(jù)接收處理 void com_out(void ) { unsigned char i,h,z,an,chao_zi,pp; unsigned int com_k; unsigned char com_x; z=ASC_TO_HEX(COM_R[6],COM_R[7]); h=ASC_TO_HEX(COM_R[4],COM_R[5]); chao_zi=ASC_TO_HEX(COM_R[2],COM_R[3]); if(chao_zi==0x04||chao_zi==0x05) { com_x=ASC_TO_HEX(COM_R[com_i-2],COM_R[com_i-1]); com_k=0; for(i=0;i<com_i-2;i++) { com_k+=ASC_TO_HEX(COM_R[i],COM_R[i+1]); i++; } com_k%=0xff; if(com_x!=com_k) return ; } if(chao_zi==0x04) //操作碼清EEP //操作碼1寫屏 { //if(h==0) if(!h&&(com_i==10||com_i==12)) //=0 { COM_EN=1; EN =EN_off; TR0 = 0; ET0=0; //time0中斷允許控制位 for(i=0;i<13;i++) //5608eep為0x00--0x0F 共4K { IAP_CACHU (i,0); //清空EEP i++; } for(i=0;i<ZHI_HH;i++) H_ZHI[i]=0; } else // if(h==1) // if(h==1&&(com_i==8||com_i==12)) { for(i=0;i<ZHI_HH;i++) { IAP_XIE (H_ZHI[i],0x0d,210+i) ; } } } else if(chao_zi==0x01) //操作碼清EEP //操作碼1寫屏 { if(com_i<60) { for(i=8;i<72;i++) COM_R[i]= 0x00; } an=0 ; for(i=8;i<72;i++) { COM_R[an]= ASC_TO_HEX(COM_R[i],COM_R[i+1]); i++; an++; } if(h>Z_H) Z_H = h ; //字數(shù)最大行數(shù) shuzhu (z,h) ; //寫入數(shù)據(jù) } else if(chao_zi==0x05) //操作碼清EEP //操作碼1寫屏 { if(!h&&com_i==12) //=0 { EN =EN_off; COM_EN=1; TR0 = 0; ET0=0; //time0中斷允許控制位 IAP_CACHU (0x0f,0); //清空EEP PIN_ADD_b=1; //屏地址更改標志位 } else if(h==1&&com_i==12) { COM_OK=1; //寫入數(shù)據(jù)完成標志位 COM_EN=0; } } else if(chao_zi==0x03) //操作碼參數(shù)設(shè)置 { // H1_wwww=0; if(h==4&&PIN_ADD_b) //寫入屏地址 PIN_ADD_b=0; //屏地址更改標志位 { z=ASC_TO_HEX(COM_R[6],COM_R[7]); IAP_XIE (z,0x0F,250) ; COM_ADDRES= IAP_DU (0x0f,250); PIN_ADD_b=0; //屏地址更改標志位 } else if(COM_EN) //寫入屏地址 { if(h==0x0d) //寫入屏地址 { z=ASC_TO_HEX(COM_R[6],COM_R[7]); IAP_XIE (z,0x0F,251) ; } else { pp=ASC_TO_HEX(COM_R[8],COM_R[9]); chan_shu(pp,h,z) ; } } } INSZ8(); } void IAP_FUWEI (void) { ISP_CONTR=0x00; ISP_CMD=0x00; ISP_TRIG=0x00; ISP_ADDRH=0xff; ISP_ADDRL=0xff; //ISP_DATA=0xff; } /*讀*/ unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_CMD=0x01; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); return ISP_DATA; } /*寫*/ void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_DATA=IAP_DATA; ISP_CMD=0x02; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); } /*擦除*/ void IAP_CACHU (unsigned char ADDH,unsigned char ADDL) { ISP_ADDRH=ADDH; ISP_ADDRL=ADDL; ISP_CMD=0x03; ISP_CONTR=0x84; ISP_TRIG=0x46; ISP_TRIG=0xB9; IAP_FUWEI(); } /*****************延遲DELAY******************** **/ void delay(unsigned int a) //1-50ms /24M { unsigned int i; for(;a>0;a--) for(i=0;i<9988;i++) WDT_CONTR = 0x3C; //狗;; } void XIE_RAM2 (unchar zhi_ju,unchar DAT_R,unchar di,bit a) { unsigned char shuzhu,dat_i,i,ADDH,w; unsigned int k,da_k; di=0; if(zi>=DAT_R) { Zhi_ZHI=1; return ; } i=0; ADDH = zhi_ju; //取扇區(qū)地址 for(dat_i=0;dat_i<16;dat_i++) { for(shuzhu=0;shuzhu<PIN_ZI;shuzhu++) // PIN_ZI { if(a) { if(shuzhu==di) { k=(COM_DATA[0]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[1]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } else if(shuzhu==di+1) { k=(COM_DATA[2]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[3]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } else if(shuzhu==di+2) { k=(COM_DATA[4]*16)+dat_i; DAT_RAM2[i]=Dat_pin[k]; DAT_RAM2[i]<<=8; k=(COM_DATA[5]*16)+dat_i; DAT_RAM2[i]|=Dat_pin[k]; i++; } /* else if(shuzhu==4) { DAT_RAM2[i]=0; i++; } */ else goto xei_2; } else { xei_2: da_k=shuzhu*32; k= dat_i+dat_i+da_k; // if(k<256) { DAT_RAM2[i]=IAP_DU (ADDH,k); } else { w=k-256; DAT_RAM2[i]=IAP_DU (ADDH+1,w); } DAT_RAM2[i]<<=8; k++; if(k<256) { DAT_RAM2[i]|=IAP_DU (ADDH,k); } else { w=k-256; DAT_RAM2[i]|=IAP_DU (ADDH+1,w); } i++; //字總數(shù)0-3 總計4個字 } } } // zi+=4; } QING_RAM2() { unsigned char dat_i; for(dat_i=0;dat_i<RAM_SHU;dat_i++) DAT_RAM2[dat_i]=0; // for(dat_i=0;dat_i<16;dat_i++) // DAT_XIAN_ID[dat_i]=0; } //開啟顯示定時掃描 void dingsi(void) { TMOD |= 0x01; TH0 = 0xF8; TL0 = 0x2f; ET0=1; TR0=1; EA=1; PT0=1; //優(yōu)先級 } //程序初始化 void CHU_SHI(void) { unsigned char i,z,an; EN =EN_off; //關(guān)顯示屏 dingsi(); //開啟顯示掃描定時 QING_RAM2(); //清顯示緩沖區(qū)RAM2內(nèi)存 delay(10); //開機延遲 COM_OK=0; //寫入數(shù)據(jù)完成標志位清零 Zhi_h=0; //當前顯示字區(qū)默認為0 Zhi_b=0; //調(diào)用顯示標志位清零 COM_ADDRES=IAP_DU (0x0f,250); //本機地址 z= IAP_DU (0x0f,251); // if(z) EN_on=1; //顯示屏亮度--1----------------------------------------------------------- // else // EN_on=0; for(i=0;i<14;i++) { if(i<6) { z=i*20; an=0x0e; } else { z=(i-6)*20; an=0x0f; } } Z_LMAX=PIN_ZI*2; SHU_1_14=RAM_SHU-PIN_ZI; } void chunchu_A( sw,sb,sg,add1) { IAP_CACHU (add1,0); //清空EEP 3扇區(qū) IAP_XIE (sw,add1,200) ; IAP_XIE (sb,add1,201) ; IAP_XIE (sg,add1,202) ; } unsigned char jp(unsigned char an) { unsigned char i; switch(an) { case 2: //K2_A組 WDT_CONTR = 0x3C; //狗;; if(S2_b==0) //K2_A { EXIT1 : if(K2_A==0) { for(i=0;i<100;i++) ; if(K2_A!=0) goto EXIT1; S2_b=1; return 1; } } else { if(K2_A==1) { S2_b=0; return 0; } } break; case 3: //K3_B組 if(S3_b==0) { EXIT2 : if(K3_B==0) { for(i=0;i<100;i++) ; if(K3_B!=0) goto EXIT2; S3_b=1; return 1; } } else { if(K3_B==1) { S3_b=0; return 0; } } break; } } unsigned char jp5S(unsigned char an) { unsigned char n; unsigned int i; switch(an) { case 2: //K2_A組 按紐2清除A/B組數(shù)據(jù) WDT_CONTR = 0x3C; //狗;; if(S2_b==0) //K2_A 按紐2清除A/B組數(shù)據(jù) { EXIT21 : if(K2_A==0) { for(n=0;n<5;n++) { for(i=0;i<6000;i++) ; delay(36); //延遲 // WDT_CONTR = 0x3C; //狗;; if(K2_A!=0) goto EXIT21; for(i=0;i<6000;i++) ; delay(36); //延遲 if(K2_A!=0) goto EXIT21; for(i=0;i<6000;i++) ; delay(36); //延遲 if(K2_A!=0) goto EXIT21; } for(i=0;i<100;i++) ; if(K2_A!=0) goto EXIT21; S2_b=1; return 1; } } else { if(K2_A==1) { S2_b=0; return 0; } } break; case 3: //K3_B組 if(S3_b==0) { EXIT32 : if(K3_B==0) { for(n=0;n<5;n++) { for(i=0;i<6000;i++) ; delay(36); //延遲 if(K3_B!=0) goto EXIT32; for(i=0;i<6000;i++) ; delay(36); //延遲 if(K3_B!=0) goto EXIT32; for(i=0;i<6000;i++) ; delay(36); //延遲 if(K3_B!=0) goto EXIT32; } S3_b=1; return 1; } } else { if(K3_B==1) { S3_b=0; return 0; } } break; } } void set_IN_HL(void) { unsigned char i,w,bei; w= IAP_DU (0x0A,204); bei=w; if(w>0) w=1; COM_DATA[0] =12; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 for(i=0;i<50;i++) { if(jp(3)==1) { w=!w; COM_DATA[0] =12; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 } delay(20) ; } delay(200) ; if(bei!=w) { QING_RAM2(); //清顯示緩沖區(qū)RAM2內(nèi)存 delay(10) ; IAP_CACHU (0x0A,0); //清空EEP 3扇區(qū) IAP_XIE (w,0x0A,204) ; } } void set_IN_time(void) { unsigned char i,w,bei; w= IAP_DU (0x0c,204); bei=w; // if(w>0) // w=1; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 for(i=0;i<100;i++) { if(jp(3)==1) { w++; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 } else if(jp(2)==1) { w--; COM_DATA[0] =13; COM_DATA[1] =0; COM_DATA[2] =0; COM_DATA[3] =0; COM_DATA[5] =0; COM_DATA[4] =w; //最后一位 XIE_RAM2(1,16,0,1); //顯示當前A值 } delay(20) ; } delay(200) ; QING_RAM2(); //清顯示緩沖區(qū)RAM2內(nèi)存 delay(10) ; IAP_CACHU (0x0c,0); //清空EEP 3扇區(qū) IAP_XIE (w,0x0c,204) ; } unsigned char IN_j(void) { unsigned int i; if(in_b==0) { EXIT3 : WDT_CONTR = 0x3C; //狗;; if(IN_1==hl_b) { for(i=0;i<6000;i++) ; delay(IN_time); //延遲 if(IN_1!=hl_b) goto EXIT3; if(IN_1==hl_b) for(i=0;i<6000;i++) ; delay(IN_time); //開機延遲 if(IN_1!=hl_b) goto EXIT3; in_b=1; return 1; } } else { if(IN_1!=hl_b) { in_b=0; return 0; } } } void xianshi(unchar a0,unchar a1,unchar a2,unchar a3,unchar a4 ) { COM_DATA[1]=a0 ; COM_DATA[2]=a1 ; COM_DATA[3]=a2 ; COM_DATA[4]=a3; COM_DATA[5]=a4 ; COM_DATA[0]=16 ; XIE_RAM2(Zhi_h+1,H_ZHI[Zhi_h],JIAO_HAO_1[Zhi_h],JIAO_HAO_1[Zhi_h]); // XIE_RAM2(1,16,0,1); //顯示當前A值 } /********************8位接收設(shè)置**********************/ void INSZ8(void) { SCON = 0x50; // 晶振18.432M PCON |=0x80; TMOD |= 0X20; TMOD &= 0XEF; TH1 = 0XF6; //9600 晶振18.432M TL1 = 0xf6; TR1=1; IE |= 0x90; // RE = 0; } // /*****************主程序區(qū)****************************/ void main(void) { unsigned char idata i,ab_ch; unsigned int idata time_f; unsigned char idata ucdata_B[3]; bit A_B,time_bit,ab_b; delay(1); //開機延遲 dingsi(); //開啟顯示掃描定時 zi=0; Zhi_ZHI=0; time_s=0; da_H=0;//行掃開始值 CHU_SHI(); //初始化 INSZ8(); //開啟串口接收 18.432M-19200--------------- if(jp5S(3)==1) set_IN_HL() ; // 輸入端高低電平有效位設(shè)置 if(jp5S(2)==1) set_IN_time() ; time_bit=0 ; //是否有數(shù)據(jù)需要保存標志位 A_B=0; //顯示A/B組標志位 IN_HL= IAP_DU (0x0A,204); //讀出輸入端高低電平為有效位 IN_time= IAP_DU (0x0c,204); if(IN_time>200) { IN_time=5; IAP_CACHU (0x0c,0); //清空EEP 3扇區(qū) IAP_XIE (IN_time,0x0c,204) ; } if(IN_HL>0) hl_b=0; else hl_b=1; in_b=1; //防止誤動作 xianshi(10,11,16,16,16 ) ; //B delay(100) ; i=IAP_DU (0x04,200); if(i>99) ucdata_B[0]=0; else ucdata_B[0]= i ; i=IAP_DU (0x04,201); if(i>99) ucdata_B[1]=0; else ucdata_B[1]= i ; i=IAP_DU (0x04,202); if(i>99) ucdata_B[2]=0; else ucdata_B[2]= i ; xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B /* delay(200) ; xianshi(10,16,16,16,16 ) ; //A delay(200) ; i=IAP_DU (0x03,200); if(i>99) ucdata[0]=0; else ucdata[0]= i ; i=IAP_DU (0x03,201); if(i>99) ucdata[1]=0; else ucdata[1]= i ; i=IAP_DU (0x03,202); if(i>99) ucdata[2]=0; else ucdata[2]= i ; */ // xianshi(ucdata[2]%10,ucdata[1]/10,ucdata[1]%10,ucdata[0]/10,ucdata[0]%10 ) ; //顯示當前A值 while(1) { open: WDT_CONTR = 0x3C; //狗; delay(1) ; i=1; for(i=0;i<3;i++); if(IN_j()==1) //有數(shù)據(jù)輸入 { if(ucdata_B[0]>=99) { ucdata_B[0]=0; if(ucdata_B[1]>=99) { ucdata_B[1]=0; if(ucdata_B[2]>=99) ucdata_B[2]=0; else ucdata_B[2]++; } else ucdata_B[1]++; } else ucdata_B[0]++; xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B time_f=0; time_s=0; time_bit=1; ab_b=0; } if(time_s>60000&&time_bit) { time_f++; time_s=0; if(time_f>5) // { time_bit=0; time_f=0; chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); } } if(jp5S(3)==1)//按紐3顯示B組數(shù)據(jù) { xianshi(11,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B ab_b=1; ab_ch=0; } else { if(ab_b) { ab_ch++; if(ab_ch>100) { chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B ab_b=0; } } } if(jp5S(2)==1)//按紐2清除A/B組數(shù)據(jù) { ucdata_B[0]=0; ucdata_B[1]=0; ucdata_B[2]=0; QING_RAM2(); //清顯示緩沖區(qū)RAM2內(nèi)存 delay(10) ; chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04); xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////顯示當前值B } goto open; } } /* 程序完成時間: */ |
如果需要,我?guī)啄昵坝袀LED計算器的程序可以傳上來,你看看 |
你這個板子是老板子了,如是你能顯示圖1的話,說明你的驅(qū)動應(yīng)當是OK的,我沒細看你和程序 |
你第一張圖已經(jīng)說是板子是好的,程序問題 |
就是不明白為什么有幾行會不亮? 用了幾個程序都是這樣 |
顯示不全,就是不知道原因 |
先開一段RAM做顯示緩存,一行一行的掃,一行數(shù)據(jù)全部發(fā)完再鎖存, |
要看你用的什么型號的片子,可以考慮用定時器中斷掃描 |
xdata struct j_RAM // 顯示緩存 { U16 j_ram_Lie[PIN_ZI]; //開顯示緩沖區(qū) }j_ram_Hang[16]; |
以前的程序,很多是對你沒用的,取了一段 |
for (k=0;k<lieshu;k++) //12 lieshu { da_k=j_ram_Hang[da_H].j_ram_Lie[k] ; for (i=0;i<16;i++) { R1_DAT=!(da_k&0x8000); CK_CLK = 1; _nop_(); CK_CLK = 0; da_k<<=1; } } |
想弄好16x64,在弄32x64這個大板 |
用這個程序驅(qū)動,顯示不全 |
for(j=0;j<17;j++)應(yīng)為for(j=0;j<16;j++) |
把程序附上 #include<reg52.h> #define uchar unsigned char #define uint unsigned int #define hang P1 //行掃描接在P1口 sbit g1=P0^0; //使能端OE sbit ds=P0^1; //紅色數(shù)據(jù) sbit clk=P0^3; //時鐘信號 sbit stcp=P0^2; //鎖存信號 sbit mr=P0^4; // uint counter; uchar flag; uchar code display[ ]={ /*-- 文字: 好 --*/ /*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/ 0x10,0x00,0x11,0xFC,0x10,0x08,0x10,0x10,0xFC,0x20,0x24,0x20,0x24,0x20,0x27,0xFE, 0x44,0x20,0x64,0x20,0x18,0x20,0x08,0x20,0x14,0x20,0x26,0x20,0x44,0xA0,0x80,0x40, /*-- 文字: 好 --*/ /*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/ 0x10,0x00,0x11,0xFC,0x10,0x08,0x10,0x10,0xFC,0x20,0x24,0x20,0x24,0x20,0x27,0xFE, 0x44,0x20,0x64,0x20,0x18,0x20,0x08,0x20,0x14,0x20,0x26,0x20,0x44,0xA0,0x80,0x40, /*-- 文字: 學 --*/ /*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/ 0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40, 0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00, /*-- 文字: 習 --*/ /*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/ 0x00,0x00,0x3F,0xFC,0x00,0x04,0x08,0x04,0x04,0x04,0x03,0x04,0x01,0x14,0x00,0x64, 0x01,0x84,0x06,0x04,0x38,0x04,0x10,0x04,0x00,0x04,0x00,0x24,0x00,0x14,0x00,0x00, /*-- 文字: 天 --*/ /*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/ 0x00,0x00,0x3F,0xFC,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x7F,0xFE,0x00,0x80, 0x00,0x80,0x01,0x40,0x02,0x40,0x04,0x20,0x18,0x10,0x70,0x08,0x20,0x04,0x00,0x02, /*-- 文字: 天 --*/ /*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/ 0x00,0x00,0x3F,0xFC,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x7F,0xFE,0x00,0x80, 0x00,0x80,0x01,0x40,0x02,0x40,0x04,0x20,0x18,0x10,0x70,0x08,0x20,0x04,0x00,0x02, /*-- 文字: 向 --*/ /*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/ 0x00,0x40,0x00,0x20,0x3F,0xFC,0x20,0x04,0x20,0x04,0x27,0xE4,0x24,0x24,0x24,0x24, 0x24,0x24,0x24,0x24,0x27,0xE4,0x24,0x24,0x20,0x04,0x28,0x04,0x10,0x04,0x00,0x00, /*-- 文字: 上 --*/ /*-- 宋體12; 此字體下對應(yīng)的點陣為:寬x高=16x16 --*/ 0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x1F,0x80,0x00,0x80, 0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x20,0x80,0x7F,0xFE,0x00,0x00, }; void write_595(uchar shuju) //向595寫一個字節(jié)的數(shù)據(jù) { uchar i; for(i=0;i<8;i++) { ds=(~shuju)&0x01; clk=1; clk=0; shuju=shuju>>1; } } void delay_ms(uchar x) //x=50演延時10ms { uchar a,b; for(a=x;a>0;a--) for(b=200;b>0;b--); } void main() //主函數(shù) { while(1) { uchar i,j; for(i=100;i>0;i--) //顯示時間 for(j=0;j<17;j++) { write_595(display[j*2+4*32+1]); write_595(display[j*2+4*32]); write_595(display[j*2+5*32+1]); write_595(display[j*2+5*32]); write_595(display[j*2+6*32+1]); write_595(display[j*2+6*32]); write_595(display[j*2+7*32+1]); write_595(display[j*2+7*32]); g1=0; //154使能 stcp=1; stcp=0; hang=j; } |
xing1234 發(fā)表于 2014-11-11 16:23 一次將4個字的數(shù)據(jù)發(fā)完,就會有幾行不亮,字顯示不全。 |
你一次將4個字的數(shù)據(jù)發(fā)完再鎖存就OK了 |
Powered by 單片機教程網(wǎng)