📄 main.c
字号:
#include<reg51.h>
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
void gdct()
{
//;滚动彩条信号
// org 0000h
#pragma asm
Line: setb p1.4 ;行同步脉冲开始
mov r4,#13 ;设定循环次数
clr p1.4 ;行同步脉冲结束
inc dptr ;计数器递增,并作行消隐前肩的延时
mov r3,#45 ;预先设定场消隐计数器初值
mov p1,7
djnz r0,aaa
mov r0,#15
nop
sjmp bbb
aaa: cjne r0,#7,ccc
nop
nop
bbb: mov a,r1
add a,#4
mov r1,a
mov r4,#9
cjne a,b,ccc
mov r7,#0
dec r4
ccc: djnz r4,$
clr a
mov p1,a
cjne a,dph,Line ;继续下一行周期
Frame: setb p1.4 ;场消隐期间仍要行同步脉冲
mov r2,#12 ;设定延时时间
clr p1.4 ;行同步脉冲结束
FF: cjne r3,#32,FB ;倒数到32时,开始场同步信号
sjmp Chg
FB: cjne r3,#30,Cnt ;倒数到30时,结束场同步信号
Chg: cpl p1.5 ;场同步信号反转
sjmp Dly
Cnt: mov dptr,#-480 ;设定显示区域的行数
mov r1,a
Dly: djnz r2,$ ;延时
xch a,b
add a,#148 ;((480-512)+45*148)\256=4
xch a,b
mov r7,#7
cjne r3,#1,Next ;判断场消隐是否到时
ajmp Line ;转到显示区域信号输出
Next: djnz r3,Frame ;继续场消隐周期
#pragma endasm
}
void hbst()
{
#pragma asm
//;黑白竖条
// org 0000h
Line1: setb p1.4 ;行同步脉冲开始
mov r3,#45 ;预先设定场消隐计数器初值
clr p1.4 ;行同步脉冲结束
inc dptr ;计数器递增,并作行消隐前肩的延时
inc dptr
setb p1.3
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
inc p1
dec p1
mov p1,a
cjne a,dph,Line1 ;继续下一行周期
Frame1: setb p1.4 ;场消隐期间仍要行同步脉冲
mov r2,#14 ;设定延时时间
clr p1.4 ;行同步脉冲结束
FF1: cjne r3,#32,FB1 ;倒数到32时,开始场同步信号
sjmp Chg1
FB1: cjne r3,#30,Cnt1 ;倒数到30时,结束场同步信号
Chg1: cpl p1.5 ;场同步信号反转
sjmp Dly1
Cnt1: mov dptr,#-960 ;设定显示区域的行数
nop ;匹配周期时长
Dly1: djnz r2,$ ;延时
cjne r3,#1,Next1 ;判断场消隐是否到时
ajmp Line1 ;转到显示区域信号输出
Next1: djnz r3,Frame1 ;继续场消隐周期
#pragma endasm
}
void kct()
{
#pragma asm
//;宽彩条信号
// org 0000h
Line2: setb p1.4 ;行同步脉冲开始
nop ;延时
clr p1.4 ;行同步脉冲结束
inc dptr ;计数器递增,并作行消隐前肩的延时
inc dptr
mov p1,#15 ;设定循环次数
mov r3,#45 ;预先设定场消隐计数器初值
djnz p1,$ ;输出彩条信号
cjne a,dph,Line2 ;继续下一行周期
Frame2: setb p1.4 ;场消隐期间仍要行同步脉冲
mov r2,#14 ;设定延时时间
clr p1.4 ;行同步脉冲结束
FF2: cjne r3,#32,FB2 ;倒数到32时,开始场同步信号
sjmp Chg2
FB2: cjne r3,#30,Cnt2 ;倒数到30时,结束场同步信号
Chg2: cpl p1.5 ;场同步信号反转
sjmp Dly2
Cnt2: mov dptr,#-960 ;设定显示区域的行数
nop ;匹配周期时长
Dly2: djnz r2,$ ;延时
cjne r3,#1,Next2 ;判断场消隐是否到时
ajmp Line1 ;转到显示区域信号输出
Next2: djnz r3,Frame2 ;继续场消隐周期
#pragma endasm
}
void qp()
{
#pragma asm
//;棋盘信号
// org 0000h
Line3: setb p1.4 ;行同步脉冲开始
mov r4,#7 ;延时
clr p1.4 ;行同步脉冲结束
inc dptr ;计数器递增,并作行消隐前肩的延时
mov r3,#45 ;预先设定场消隐计数器初值
mov p1,b
djnz r0,aaa3
xrl p1,#7
xrl b,#7
xrl p1,#7
mov r0,#80
mov r4,#5
aaa3: xrl p1,#7
djnz r4,aaa3
mov p1,#0
cjne a,dph,Line3 ;继续下一行周期
Frame3: setb p1.4 ;场消隐期间仍要行同步脉冲
mov r2,#14 ;设定延时时间
clr p1.4 ;行同步脉冲结束
FF3: cjne r3,#32,FB3 ;倒数到32时,开始场同步信号
sjmp Chg3
FB3: cjne r3,#30,Cnt3 ;倒数到30时,结束场同步信号
Chg3: cpl p1.5 ;场同步信号反转
sjmp Dly3
Cnt3: mov dptr,#-480 ;设定显示区域的行数
;nop ;匹配周期时长
mov r0,#80
Dly3: djnz r2,$ ;延时
cjne r3,#1,Next3 ;判断场消隐是否到时
ajmp Line3 ;转到显示区域信号输出
Next3: djnz r3,Frame3 ;继续场消隐周期
#pragma endasm
}
void xq()
{
#pragma asm
//;细彩条
// org 0000h
Line4: setb p1.4 ;行同步脉冲开始
mov r3,#45 ;预先设定场消隐计数器初值
clr p1.4 ;行同步脉冲结束
inc dptr ;计数器递增,并作行消隐前肩的延时
inc dptr
nop
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
mov p1,a
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
inc p1
mov p1,a
cjne a,dph,Line4 ;继续下一行周期
Frame4: setb p1.4 ;场消隐期间仍要行同步脉冲
mov r2,#14 ;设定延时时间
clr p1.4 ;行同步脉冲结束
FF4: cjne r3,#32,FB4 ;倒数到32时,开始场同步信号
sjmp Chg4
FB4: cjne r3,#30,Cnt4 ;倒数到30时,结束场同步信号
Chg4: cpl p1.5 ;场同步信号反转
sjmp Dly4
Cnt4: mov dptr,#-960 ;设定显示区域的行数
nop ;匹配周期时长
Dly4: djnz r2,$ ;延时
cjne r3,#1,Next4 ;判断场消隐是否到时
ajmp Line4 ;转到显示区域信号输出
Next4: djnz r3,Frame4 ;继续场消隐周期
#pragma endasm
}
void main()
{
while(1)
{
if(!P30)gdct();
if(!P31)hbst();
if(!P32) kct();
if(!P33)qp();
if(!P34)xq();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -