efan 23:04:26 有對漢字LED點陣顯示熟悉的朋友嗎? 要下雨了 23:04:51 什么問題 typhoon 23:04:54 恩 efan 23:05:11 有段程序看不太懂 efan 23:05:26 #include <reg52.h> #define int8 unsigned char #define int16 unsigned int #define int32 unsigned long int8 flag; int8 n; int8 code table[][32]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/* " " */
{0x04,0x28,0x08,0x24,0x32,0x22,0xC2,0x21,0xC2,0x26,0x34,0x38,0x04,0x04,0x08,0x18,0x30,0xF0,0xC0,0x17,0x60,0x10,0x18,0x10,0x0C, 0x14,0x06,0x18,0x04,0x10,0x00,0x00},/*"歡",0*/
{0x02,0x02,0x04,0x82,0xF8,0x73,0x04,0x20,0x02,0x00,0xE2,0x3F,0x42,0x20,0x82,0x40,0x02,0x40,0xFA, 0x3F,0x02,0x20,0x42,0x20,0x22,0x20,0xC2,0x3F,0x02,0x00,0x00,0x00},/*"迎",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}/* " " */ }; void delay(void); int16 offset; void main(void) { int8 i; int8 *p; flag=0x10; n=0; TMOD=0x01; TH0=0xb1; TL0=0xe0; ET0=1; EA=1; TR0=1; p=&table[0][0]; while (1) { for (i=0;i<8;i++) //顯示左半邊屏幕 { P0=*(p+offset+2*i); P2=i|0x08; //P2.4=0,P2.3=1 選中U2, 輸出掃描碼給U6 delay(); P0=*(p+offset+2*i+1); P2=i|0x10; //P2.4=1,P2.3=0 選中U3, 輸出掃描碼給U7 delay(); } for (i=8;i<16;i++) //顯示右半邊屏幕 { P0=*(p+offset+2*i); P2=(i-8)|0x20; //P2.5=1 P2.4=0,P2.3=0 選中U4,輸出掃描碼U8 delay(); P0=*(p+offset+2*i+1); P2=(i-8)|0x40; //P2.6=1 P2.5=0,P2.4=0 選中U5,輸出掃描碼U9 delay(); } } } void delay(void) { int16 i; for (i=0;i<50;i++) ; } void timer0() interrupt 1 using 3 { TF0=0; TH0=0xb1; TL0=0xe0; if (n<10) { n++; } else { offset+=2; if (offset>1100) offset=0; n=0; } } efan 23:05:57 程序有兩個地方不太明白 1. P0=*(p+offset+2*i); 為什么要乘以2,原理是什么? 2.void timer0() interrupt 1 using 3 這個中斷是為了產(chǎn)生offset的原理是什么,為什么能實現(xiàn)漢字的移動顯示(從右至左) efan 23:07:31 這段程序?qū)崿F(xiàn)漢字從左到右滾動顯示 ╄→狂人╰☆ 23:07:38 1 16*16的點陣 2 每掃一次偏移地址加2 efan(6939780) 23:08:35 能具體一點嗎? efan(6939780) 23:09:22 1。里面還加了個 offset, 為什么能實現(xiàn)跑馬顯示 ╄→狂人╰☆(63637313)23:09:23 每行16個led,當(dāng)然要用2個字節(jié),這個明白吧 efan(6939780) 23:09:38 這個懂了 ╄→狂人╰☆(63637313)23:10:33 中斷一次,數(shù)據(jù)整體下移一行,有問題嗎? efan(6939780) 23:10:51 我想想。。。 efan(6939780) 23:12:23 不理解,是不是指offset+=2? 要下雨了(422583941)23:12:58 是吧 ╄→狂人╰☆(63637313)23:13:11 我沒仔細(xì)看 太長了 你明白了原理再看程序就簡單了 efan(6939780) 23:13:39 他是左跑馬,為何下移動阿? ╄→狂人╰☆(63637313)23:14:09 我隨便說的 efan(6939780) 23:14:18
╄→狂人╰☆(63637313)23:14:58
要下雨了(422583941)23:15:00 向左跑 就是說逐步去掉左邊的一些代碼不要 要下雨了(422583941)23:15:44 第一列的數(shù)據(jù)逐步往右邊取 efan(6939780) 23:17:17 對照漢字碼看一下 {0x04,0x28,0x08,0x24,0x32,0x22,0xC2,0x21,0xC2,0x26,0x34,0x38,0x04,0x04,0x08,0x18,0x30,0xF0,0xC0,0x17,0x60,0x10,0x18,0x10,0x0C, 0x14,0x06,0x18,0x04,0x10,0x00,0x00},/*"歡",0*/ 起始為 0x04,0x28 中斷一次,跳到哪個了?是不是0x08,0x24? 要下雨了(422583941)23:17:38 是的 要下雨了(422583941)23:17:51 第一列就顯示了0x08,0x24 要下雨了(422583941)23:18:18 你這個程序運(yùn)行對了沒有 efan(6939780) 23:19:03 跑了,proteus沒問題 要下雨了(422583941)23:19:12 哦 要下雨了(422583941)23:19:12 哦 要下雨了(422583941)23:19:36 明白了嗎 ╄→狂人╰☆(63637313)23:20:18 你單步跑下就更清楚了 efan(6939780) 23:20:20 程序還有點點不明白,原理曉得了 efan(6939780) 23:38:59 我說一下算了,電路很簡單,p0口發(fā)漢字碼,p1口輸出掃描碼 |