ex9:在屏幕中央显示 welcome to asm!

assume cs:code,ds:data
data segment
    db "welcome to asm!"
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov si,0
    mov bx,0
    mov ax,0b800h
    mov es,ax
    mov di,12*160+32*2
    mov cx,15
  s:mov al,[si]
    mov byte ptr es:[di],al
    inc si
    inc di
    mov byte ptr es:[di],2h
    inc di
    loop s
   
   
    mov ax,4c00h
    int 21h
code ends
end start
#include<reg52.h> #include <intrins.h> #define uchar unsigned char #define DS1302_SECOND_WRITE 0x80 #define DS1302_MINUTE_WRITE 0x82 #define DS1302_HOUR_WRITE 0x84 #define DS1302_DAY_WRITE 0x86 #define DS1302_WEEK_WRITE 0x8a #define DS1302_MONTH_WRITE 0x88 #define DS1302_YEAR_WRITE 0x8c #define DS1302_PROTECT_WRITE 0x8e #define DS1302_SECOND_READ 0x81 #define DS1302_MINUTE_READ 0x83 #define DS1302_HOUR_READ 0x85 #define DS1302_DAY_READ 0x87 #define DS1302_WEEK_READ 0x8b #define DS1302_MONTH_READ 0x89 #define DS1302_YEAR_READ 0x8d sbit lcden = P2^2; sbit lcdrs = P2^0; sbit write = P2^1; sbit sck = P1^6; //时钟 sbit io = P1^7; //数据 sbit rst = P1^5;// DS1302复位 unsigned char Chinese_1[3]={0x2d,0x20,0x3a};// “-”“ ”“:” unsigned char Chinese_2[7]={0x31,0x32,0x33,0x34,0x35,0x36,0x37};//一二三四五六天 //unsigned char Cursor[6]={0x81,0x83,0x85,0x90,0x92,0x94};//定义光标移动的位置 unsigned char num = 0; unsigned int ji = 0; unsigned int jiao = 0; void Delayms(unsigned int z)//延时 { unsigned int x,y; for(x=z;x>0;x--) for(y=115;y>0;y--); } //lcd子程序 void Write_com(unsigned char com)//写命令 { lcdrs = 0; P0 = com; Delayms(5); lcden = 1; Delayms(5); lcden = 0; } void Write_data(unsigned char dat)//写数据 { lcdrs = 1; P0 = dat; Delayms(5); lcden = 1; Delayms(5); lcden = 0; } unsigned char Read_com()//读命令 { unsigned char com; write = 1; lcdrs = 0; lcden = 1; com = P0; Delayms(5); write = 0; lcdrs = 0; lcden = 0; return com; } void init_lcd()//lcd初始化 { lcden = 0; Write_com(0x38); Write_com(0x0c); Write_com(0x06); Write_com(0x01); Write_com(0x80); } //ds1302子程序 void DS1302WriteByte(uchar dat)//写字节 { uchar i; sck=0; Delayms(2); for(i=0;i<8;i++) { io=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的 Delayms(2); sck=1; Delayms(2); sck=0; dat>>=1; } } uchar DS1302ReadByte()//读字节 { uchar i,dat; Delayms(2); for(i=0;i<8;i++) { dat>>=1; if(io==1)//当数据线为高时,证明该位数据为1 dat|=0x80;//要传输数据的当前值置为1,若不是,则为0 sck=1; Delayms(2); sck=0; Delayms(2); } return dat; } uchar DS1302Read(uchar cmd)//读命令 { uchar dat; rst=0; sck=0; rst=1; DS1302WriteByte(cmd);//传输地址 dat=DS1302ReadByte();//读取要得到的时间/日期 sck=1; rst=0; return dat; } void DS1302Write(uchar cmd,uchar dat)//写命令 { rst=0; sck=0; rst=1; DS1302WriteByte(cmd);//传输地址 DS1302WriteByte(dat);//写入时间/日期 sck=1; rst=0; } void Init_DS1302(void)//初始化 { DS1302Write(0x8e,0x00);//写保护关 DS1302Write(DS1302_SECOND_WRITE,0x55);//初始秒值 DS1302Write(DS1302_MINUTE_WRITE,0x59);//初始分钟 DS1302Write(DS1302_HOUR_WRITE,0x23);//初始为24小时模式初始时间为 DS1302Write(DS1302_DAY_WRITE,0x02);//20xx年x月x日星期x DS1302Write(DS1302_MONTH_WRITE,0x03); DS1302Write(DS1302_YEAR_WRITE,0x16); DS1302Write(DS1302_WEEK_WRITE,0x03); DS1302Write(0x90,0x01);//充电 DS1302Write(0xc0,0xf0);//初始化一次标示 DS1302Write(0x8e,0x80); } void Split_display(unsigned char address)//取数显示 { unsigned char i; i=DS1302Read(address); i=i/16+&#39;0&#39;; Write_data(i);//显示十位 Delayms(3); i=DS1302Read(address); i=i%16+&#39;0&#39;; Write_data(i);//显示个位 Delayms(5); } void Dispaly_shi()//显示时间 { Write_com(0x84); Split_display(DS1302_HOUR_READ);//显示小时 Write_data(Chinese_1[2]);//显示:” Delayms(3); Split_display(DS1302_MINUTE_READ);//显示分钟 Write_data(Chinese_1[2]); Delayms(3); Split_display(DS1302_SECOND_READ);//显示秒 Delayms(3); Delayms(50); } void Display_nian()//显示年月日 { uchar i; Write_com(0x82); Delayms(100); Write_com(0x82); Delayms(100); Write_data(&#39;2&#39;); Delayms(5); Write_data(&#39;0&#39;); Delayms(1); Split_display(DS1302_YEAR_READ);//显示年份 Write_data(Chinese_1[0]);//显示“-” Delayms(3); Split_display(DS1302_MONTH_READ);//显示月份 Write_data(Chinese_1[0]); Delayms(3); Split_display(DS1302_DAY_READ);//显示日期 Write_data(Chinese_1[1]); Delayms(3); Write_data(Chinese_1[1]); Delayms(3); i=DS1302Read(DS1302_WEEK_READ);//显示星期 i=i%16+&#39;0&#39;; Write_data(i); Delayms(3); Write_com(0x82); Delayms(50); } void inter0() interrupt 0//按键中断1 { ji = ji+1; if(ji%2 == 0) Write_com(0x0c); else Write_com(0x08); } void inter2() interrupt 2//按键中断2 { unsigned char k,j,i,b; //Delayms(500); while(INT1!=1); b = Read_com(); b = ACC & 0x7f; Write_com(0x01); Dispaly_shi(); EA = 0; EX0=0;EX1=0; k=DS1302Read(DS1302_SECOND_READ); while(INT1) { Write_com(0x8a); Write_com(0x0f); if(INT0==0) { Delayms(10); if(INT0==0) { if(k<0x59) { ACC = k; #pragma asm add a,#1 da a #pragma endasm k = ACC; } else { DS1302Write(DS1302_SECOND_WRITE,k); while(k!=0) { k=DS1302Read(DS1302_SECOND_READ);} Write_com(0x01); Dispaly_shi(); } Write_com(0x8a); i=k/16+&#39;0&#39;; j=k%16+&#39;0&#39;; Write_data(i); Delayms(3); Write_data(j); while(!INT0); } } } while(!INT1); DS1302Write(DS1302_SECOND_WRITE,k); Write_com(0x0c); Write_com(0x01); if(jiao==0) { Dispaly_shi();} else {Display_nian();} Write_com(b); EA = 1; EX0=1;EX1=1; } void main() { uchar i; write = 0; Delayms(50); IT0=1;IT1=1; EX0=1;EX1=1; EA=1; init_lcd(); Init_DS1302(); while(1) { Write_com(0x01); for(i=9;i>0;i--) Dispaly_shi(); Write_com(0x01); for(i=9;i>0;i--) Display_nian(); Delayms(50); }; }(用汇编语言来完成)
最新发布
12-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值