?? led漢字顯示_移位寄存器方式(595)程序成功.txt
字號(hào):
/* 延時(shí)子程序 */
/* */
/********************************************************/
void delay(int ms)
{
int k;
while(ms--)
{
for(k=0; k<250; k++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/********************************************************/
/* */
/*將顯示數(shù)據(jù)送入74HC595內(nèi)部移位寄存器 */
/* */
/********************************************************/
void WR_595(void)
{
uchar j;
for (j=0;j<8;j++)
{
temp=temp<<1 ;
SDATA_595=CY;
SCLK_595=1; //上升沿發(fā)生移位
_nop_();
_nop_();
SCLK_595=0;
}
}
/********************************************************/
/* */
/*將移位寄存器內(nèi)的數(shù)據(jù)鎖存到輸出寄存器并顯示 */
/* */
/********************************************************/
void OUT_595(void)
{
RCK_595=0;
_nop_();
_nop_();
RCK_595=1; //上升沿將數(shù)據(jù)送到輸出鎖存器
_nop_();
_nop_();
_nop_();
RCK_595=0;
}
/********************************************************
* *
* 主程序 *
* *
*********************************************************/
main()
{
SCLK_595=0;
RCK_595=1;
while(1)
{
uchar i;
for (i=0; i<8; i++)
{
temp=DAT[ i ]; //取顯示數(shù)據(jù)
WR_595();
OUT_595();
delay(100);
}
}
}
74ls595 8位輸出鎖存移位寄存器
RESET: 復(fù)位信號(hào)
shitf clock:移位時(shí)鐘
serial data input:串行數(shù)據(jù)輸入
output enable:輸出使能
latch clock:鎖存時(shí)鐘
595有3層結(jié)構(gòu):
第一層為移位D觸發(fā)器;
第二層為鎖存D觸發(fā)器;
第三層為輸出3態(tài)門;
當(dāng)復(fù)位信號(hào)為0時(shí),移位D觸發(fā)器清0;
當(dāng)移位脈沖從L->H時(shí),第一個(gè)移位D觸發(fā)器的Q=D;
其它的Qn=Qn-1;
當(dāng)鎖存脈沖從0->1時(shí),第二層為鎖存D觸發(fā)器的輸出=/輸入;
當(dāng)OE=1時(shí),595的輸出為高阻態(tài);
當(dāng)OE=0時(shí),595的輸出為第二層為鎖存D觸發(fā)器的輸出的反相;
問(wèn)題: 本人新手剛上路,現(xiàn)在用51單片機(jī)和74HC595來(lái)做一個(gè)控制LED顯示電路,
看74HC595資料上的說(shuō)明很簡(jiǎn)單,可是我試著去編程,卻發(fā)現(xiàn),
這個(gè)74HC595怎么也不工作啊。我對(duì)這個(gè)芯片一點(diǎn)不了解
下面是我編的程序來(lái)測(cè)試74HC595功能,
這里面肯定有錯(cuò)誤,請(qǐng)高人們指點(diǎn),小的多謝了!
enable equ p0.6 //595的13腳 輸出使能引腳
shift equ p0.4 //595的11腳 輸入移位引腳
store equ p0.5 //595的12腳 數(shù)據(jù)存儲(chǔ)引腳
data equ p3.7 //595的14腳 數(shù)據(jù)輸入引腳
我的目的很簡(jiǎn)單,只想在595的Q0-Q7段輸出01010101B (即#55H):
main_loop:
mov r4,#08h //8位
mov a,#55h //送入數(shù)據(jù)
clr c
setb enable //不使能輸出
move_data:
rrc a //把要發(fā)送數(shù)據(jù)移入C
mov data,c //一位一位的輸入
setb shift
setb store
nop
clr shift
clr store
nop
djnz r4,move_data //8位輸入完畢
clr enable //使能輸出
nop
call delay_5ms //延時(shí)5ms
jmp main_loop
請(qǐng)大俠們指點(diǎn)啊,急死我了,這么幾天都搞不出來(lái),毫無(wú)頭緒,跪謝!
回答1:沒(méi)人在嗎?怎么沒(méi)有人回復(fù)啊?
斑竹,救命啊
回答2:PO口此時(shí)必須上拉電阻
回答3:我修改了一下(PO口此時(shí)必須上拉電阻)main_loop:
mov r4,#08h //8位
mov a,#55h //送入數(shù)據(jù)
clr shift
// clr c //No use
move_data:
mov data,Acc.7 //一位一位的輸入
setb shift //給上升沿
nop
clr shift
rrc a //把要發(fā)送數(shù)據(jù)移入C
nop
djnz r4,move_data //8位輸入完畢
clr enable //使能輸出
nop
setb enable //不使能輸出-----給上升沿打入8bit數(shù)據(jù)
call delay_5ms //延時(shí)5ms
jmp main_loop
再試試看,根據(jù)595datasheet的時(shí)序來(lái),就可以了!
回答4:setb store/nop/nop/ clr store 放在最后就可以了
回答5:store /shift/enable三者位置關(guān)系到底怎么放呢?樓上的,請(qǐng)問(wèn)store /shift/enable三者位置關(guān)系到底怎么放呢?
使能輸出必須一直位底電平嗎?
還有就是 數(shù)據(jù)存儲(chǔ)脈沖store只能發(fā)一個(gè)嗎?而且放在第八個(gè)移位脈沖shift之后?
我很是糊涂,請(qǐng)高人指點(diǎn)迷津
回答6:網(wǎng)上找來(lái)的,給你參考一下,本人不測(cè)試過(guò)!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;595A:9----595B:14
;;595A:14-------------P3.7
;;595A:11---595B:11---P3.5
;;595A:12---595B:12---P3.4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;以下定義IO口
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DA2 EQU P3.7 ;595-14
LATCH2 EQU P3.4 ;595-12
CLK2 EQU P3.5 ;595-11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;以下定義緩沖區(qū)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DATA595A EQU 4CH
DATA595B EQU 4BH
DELBUF EQU 4AH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;操作模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV DATA595A, #0FEH
MOV DATA595B, #0EFH
LCALL DATA595
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;595子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DATA595: CLR DA2
CLR LATCH2
CLR CLK2
LCALL SDELAY
MOV A, DATA595B
MOV R7, #08H
MAIN595B1: RLC A
MOV DA2, C
LCALL SDELAY
SETB CLK2
LCALL SDELAY
CLR CLK2
LCALL SDELAY
DJNZ R7, MAIN595B1
MOV A, DATA595A
MOV R7, #08H
MAIN595B2: RLC A
MOV DA2, C
LCALL SDELAY
SETB CLK2
LCALL SDELAY
CLR CLK2
LCALL SDELAY
DJNZ R7, MAIN595B2
LCALL SDELAY
SETB LATCH2
LCALL SDELAY
LCALL SDELAY
CLR LATCH2
CLR DA2
CLR CLK2
RET
SDELAY: MOV DELBUF, #18D
SDEL1: NOP
NOP
DJNZ DELBUF, SDEL1
RET
回答7:還有一個(gè)例程.;;============================================
;; 5個(gè)74HC595一起,CLK和DATA腳分別連起來(lái),
;; LATCH腳獨(dú)立控制
;;============================================
SCLK EQU P0.1
SDATA EQU P0.0
WRITE5950: LCALL WRITE595
SETB P2.0
NOP
CLR P2.0
NOP
SETB P2.0
NOP
CLR P2.0
RET
WRITE5951: LCALL WRITE595
SETB P2.1
NOP
CLR P2.1
NOP
SETB P2.1
NOP
CLR P2.1
RET
WRITE5952: LCALL WRITE595
SETB P2.2
NOP
CLR P2.2
NOP
SETB P2.2
NOP
CLR P2.2
RET
WRITE5953: LCALL WRITE595
SETB P2.3
NOP
CLR P2.3
NOP
SETB P2.3
NOP
CLR P2.3
RET
WRITE5954: LCALL WRITE595
SETB P2.4
NOP
CLR P2.4
NOP
SETB P2.4
NOP
CLR P2.4
RET
WRITE595: MOV R5,#08H
MOV A,2AH
LOOP: RLC A
MOV P0.0,C
SETB P0.1
NOP
CLR P0.1
DJNZ R5,LOOP
RET
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -