論壇首問!!!求助大神?。。?br />
本人使用16x16點陣操作,使其顯示漢字“普”,接下來我將會發段完整的程序,這兩段完整的程序區別只在于主函數有無while(1)循環,我發現兩個程序結果一樣。
但是,本人認為第二段程序由于沒有while(1)循環,結果應該是在LED顯示屏上只有“普”字閃一下,而非一直亮著燈,求解?。?!
程序一:
#include
#include
void delay(int i)
{
while(i--);
}
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
unsigned char ledwei[]={
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char code ledduan1[]={
0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00,
0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,};
void Hc595SendByte(char dat1,char dat2,char dat3,char dat4)
{
int i;
for(i=0;i<8;++i)
{
??SER=dat1>>7;
??dat1=dat1<<1;
??SRCLK=0;
??_nop_();
??_nop_();
??SRCLK=1;
}
for(i=0;i<8;++i)
{
??SER=dat2>>7;
??dat2=dat2<<1;
??SRCLK=0;
??_nop_();
??_nop_();
??SRCLK=1;
}
for(i=0;i<8;++i)
{
??SER=dat3>>7;
??dat3=dat3<<1;
??SRCLK=0;
??_nop_();
??_nop_();
??SRCLK=1;
}
for(i=0;i<8;++i)
{? ?
??SER=dat4>>7;
??dat4=dat4<<1;
??SRCLK=0;
??_nop_();
??_nop_();
??SRCLK=1;
}
RCLK=0;
_nop_();
_nop_();
RCLK=1;
}
void main()
{
int i;
while(1)
{
??for(i=0;i<16;i++)
??{
? ? Hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan1[i+16],ledduan1[i]);
? ? delay(10);
??}
}? ?
}
程序二:
#include
#include
void delay(int i)
{
while(i--);
}
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
unsigned char ledwei[]={
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char code ledduan1[]={
0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00,
0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,};
void Hc595SendByte(char dat1,char dat2,char dat3,char dat4)
{
int i;
for(i=0;i<8;++i)
{
??SER=dat1>>7;
??dat1=dat1<<1;
??SRCLK=0;
??_nop_();
??_nop_();
??SRCLK=1;
}
for(i=0;i<8;++i)
{
??SER=dat2>>7;
??dat2=dat2<<1;
??SRCLK=0;
??_nop_();
??_nop_();
??SRCLK=1;
}
for(i=0;i<8;++i)
{
??SER=dat3>>7;
??dat3=dat3<<1;
??SRCLK=0;
??_nop_();
??_nop_();
??SRCLK=1;
}
for(i=0;i<8;++i)
{? ?
??SER=dat4>>7;
??dat4=dat4<<1;
??SRCLK=0;
??_nop_();
??_nop_();
??SRCLK=1;
}
RCLK=0;
_nop_();
_nop_();
RCLK=1;
}
void main()
{
int i;
for(i=0;i<16;i++)
{
??Hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan1[i+16],ledduan1[i]);
??delay(10);
}
? ?
}
力盡山拔 發表于 2017-2-9 08:10
不不不。。。兩個程序都是一直亮著
我是說我預測中程序二的效果是閃一下,實際上程序二的效果是一直亮著
自己頂一下
我覺得我應該介紹一下這個程序
通過四個74HC595芯片來控制16x16點陣的四個管腳
函數Hc595SendByte()里面的程序沒有問題,該函數的作用是運用串轉并的原理將四個十六進制數導入到16x16點陣的四個端口。
數組ledwei充當位選的作用
你這16X16的點陣是什么樣的接口?。孔詈觅N出原理圖
粗看你感覺你這16X16點陣就是橫著16個接口豎著16個接口,難道是串行轉并行之后沒有鎖存,所以第一個才只閃一下?
謝謝樓上的意見,原理圖已貼,確實是橫著16個接口豎著16個接口
gniquhs 發表于 2017-2-8 20:47
你這16X16的點陣是什么樣的接口???最好貼出原理圖
粗看你感覺你這16X16點陣就是橫著16個接口豎著16個接口,難道是串行轉并行之后沒有鎖存,所以第一個才只閃一下?
力盡山拔 發表于 2017-2-8 21:16
可能我沒有表達清楚
我預測的效果是程序一一直亮著,程序二只閃一下
but??實際上是兩個程序的效果一樣
圖示是ON公司74HC595的框架結構,左邊一列是移位輸出,中間一列D觸發器是鎖存,12腳的鎖存管教應該有個時序的變化(剛看了一下,應該是在串行輸出結束之后從低電平變高電平)
如此串行轉并行之后的數據就能鎖住不變,而不是一閃而逝
要改程序的話,你試下在你每個for(1-8)的大括號之后都加上下面代碼
??RCLK=0;
??_nop_();
??_nop_();
??RCLK=1;
這個好資料呀??感謝分享??
gniquhs 發表于 2017-2-8 21:59
圖示是ON公司74HC595的框架結構,左邊一列是移位輸出,中間一列D觸發器是鎖存,12腳的鎖存管教應該有個時序的變化(剛看了一下,應該是在串行輸出結束之后從低電平變高電平)
如此串行轉并行之后的數據就能鎖住不變,而不是一閃而逝
gniquhs 發表于 2017-2-8 21:31
跟我想的差不多
不過你有注意到74HC595的12腳是鎖存腳嗎?
這個腳你不用是不會鎖存數據的,所以只是閃一下
樓主記得選擇最佳答案啊
elecfansLily 發表于 2017-2-9 16:44
樓主記得選擇最佳答案啊
感覺好強大的樣子。
你現在的程序可以實現顯示移動的漢字嗎?
高通中外文字庫IC,支持全世界170多國家的語言,全國唯一字庫IC原廠,可加Q2850929208黃工索取資料
大功率電感廠家 |大電流電感工廠
如何建立一個一次性防盜報警系統 如何建立一個一次性防盜報警系統該報警的目的是健全的警報器只有一次。那就是 - 當報警被激活 - 健全的警笛會在預設的時間長度。然后,它會關閉并保持關閉。警報將不會重新啟動。基本的報警有一個獨立可調出
MSP430進入lpm4后,MCU會偶爾丟失i/o中斷430進入LMP4 ,通過外部的RTC來喚醒,偶爾會出現無法喚醒, 如果再次出發mcu 可以正常喚醒并運行,可以確定RTC是有輸出信號來喚醒MCU的,貌似mcu沒有響應邊沿中斷,
(邊沿設置、
(連載08)并聯式開關電源的工作原理1-4-1.并聯式開關電源的工作原理
圖1-11-a是并聯式開關電源的最簡單工作原理圖,圖1-11-b是并聯式開關電源輸出電壓的波形。
圖1-11-a中Ui是開關電源的工作電壓,L是儲能電感,K是