Web Content Display
;**************combine 8255, keyboard and lcm control program*************** ;**************provide this program to students for the second stage test********* ;**************Author by 許浩縈.**************** ctrl55 equ 0x5f pa55 equ 0x5e pb55 equ 0x5d pc55 equ 0x5c pcbit equ 0x5b ; a0_8255 equ p2.0 a1_8255 equ p2.1 ;***************keyboard rigisters define************** keynum equ 0x5a ;keynumber keydbl equ 0x59 ;debug bounce,double check counter equ 0x58 ;scan keyboard array bounce0 equ 0x57 bounce1 equ 0x56 key_f equ 22h.0 ;***************lcm rigisters define************** abuf equ 0x55 ;the data write to lcm atmp equ 0x54 ;the data read from lcm ;LCD_RS========>pc0;LCD_RW========>Pc1 ;LCD_En========>pc2;LCD_BUS=======>Pa0-pa7 ;data(command,address or data)==>ir(command,address) or dr(data) ;cg rom(192 words),cg ram(8*8 bytes),dd ram(80 bytes) ;first line(0) address=00h->0fh;second line(1) address->40h-4fh ;============================================================ Initial: mov ctrl55,#82h ;8255 initial status setting call wr_ctrl ;pa:output,pb:input,pc:output ; ::::::: Initial LCD ::::::: ;-------lcm function setting mov abuf,#38h ; Set for 8 bit data transfer and call wr_lcdcmd ; address type b,font=5*7 ;-------lcm display control mov abuf,#0eh ; Ture on the display and cursor. call wr_lcdcmd ; cursor no twinkle ;-------lcm entry model setting mov abuf,#06h ; Set the LCD unit to increment call wr_lcdcmd ; the address counter. ; ; 20h store in all dd ram address mov dptr,#main_scr1 ; Get the 1st row data(address) call sho_lcm1 ; Call lcm display sub-program2 mov dptr,#main_scr2 ; Get the 2nd row data(address) call sho_lcm2 ; Call lcm display sub-program2 ;+++++++main program start++++++++++++++++++++++++++++++++++++++++ loop: call scan_key mov a,keynum cjne a,#0ah,loop ;判斷是否為Menu鍵 ; sho_menu: mov dptr,#menu_scr1 call sho_lcm1 mov dptr,#menu_scr2 call sho_lcm2 call scan_key mov a,keynum cjne a,#0ah,lss ;--------------------------------------- jmp sho_main sho_lcm1: call lcd_cls ;clear display and cursor return call lcd_printstring ret sho_lcm2: ;=======cursor to second line clr a ;homing to left setb b.0 ;Cursor to second line(1) call lcd_locate ;b.0=0:line0,b.0=1:line1 call lcd_printstring ret ;=======display data array========================================= main_scr1: db "Welcome",0
mov abuf, #01h ;Clear display call wr_lcdcmd ret ; ------------------------------------------------ lcd_home: mov abuf, #02h ;Cursor home call wr_lcdcmd ret ; ------------------------------------------------ lcd_locate: anl a, #00001111b ;00-0fh or 40-4fh jnb b.0,setb7 setb acc.6 ;second address 40-4fh setb7: setb acc.7 ;data to ddram not to cgram mov abuf,a call wr_lcdcmd ret ; ------------------------------------------------ lcd_printstring: clr a movc a,@a+dptr jz endps ;if a=0 is endding mov abuf,a call wr_lcddat inc dptr jmp lcd_printstring endps: ret ; ------------------------------------------------ lcd_rdpost: call rd_lcdcom mov a,atmp clr acc.7 clr b.0 jnb acc.6,notsec ;40-4fh setb b.0 clr acc.6 notsec: ret call chk_lcdbzy mov pcbit,#0 ;lcd_rs=>pc0 call st_pc mov pcbit,#1 ;lcd_rw=>pc1 call cl_pc mov pcbit,#2 ;lcd_en=>pc2 call st_pc mov pa55,abuf ;lcd data=>pa call wr_pa mov pcbit,#2 ;lcd_en=>pc2 call cl_pc mov pcbit,#1 ;lcd_rw=>pc1 call st_pc mov pcbit,#0 ;lcd_rs=>pc0A call cl_pc ret ; ------------------------------------------------ wr_lcdcmd: call chk_lcdbzy mov pcbit,#0 ;lcd_rs=>pc0 call cl_pc ;rs=0->ir mov pcbit,#1 ;lcd_rw=>pc1 call cl_pc ;rw=0->write mov pcbit,#2 ;lcd_en=>pc2 call st_pc ;enable=1 mov pa55,abuf ;data to pa call wr_pa mov pcbit,#2 ;lcd_en=>pc2 call cl_pc mov pcbit,#1 ;lcd_rw=>pc1 call st_pc mov pcbit,#0 ;lcd_rs=>pc0 call st_pc ret ; ------------------------------------------------ rd_lcdcom: mov ctrl55,#92h ;8255 work status setting call wr_ctrl ;pa:input,pb:input,pc:output ; mov pcbit,#0 ;lcd_rs=>pc0 call cl_pc ;read ir mov pcbit,#1 ;lcd_rw=>pc1 call st_pc ;read model mov pcbit,#2 ;lcd_en=>pc2 call st_pc call rd_pa mov atmp,pa55 mov pcbit,#2 ;lcd_en=>pc2 call cl_pc mov pcbit,#1 ;lcd_rw=>pc1 call st_pc mov pcbit,#0 ;lcd_rs=>pc0 call st_pc ; mov ctrl55,#82h ;8255 raw status setting call wr_ctrl ;pa:output,pb:input,pc:output ret ; ------------------------------------------------ chk_lcdbzy: call rd_lcdcom mov a,atmp jb acc.7,chk_lcdbzy ret ;***************write data to control register wr_ctrl: ;ctrl register select=11 setb a0_8255 setb a1_8255 mov a,ctrl55 movx @r0,a ;wr signal ret ;***************output data to 8255@pa wr_pa: ;pa register select=00 clr a0_8255 clr a1_8255 mov a,pa55 movx @r0,a ;wr signal ret ;**************input data from 8255@pa rd_pa: clr a0_8255 ;pa register select=00 clr a1_8255 movx a,@r0 ;rd signal mov pa55,a ret ;***************input data from 8255@pb rd_pb: ;pb register select=01 setb a0_8255 clr a1_8255 movx a,@r0 ;rd signal mov pb55,a ret ;**************output data to 8255@pc by single-bit model st_pc: ;pc register select=10 setb a0_8255 ;ctrl register select=11 setb a1_8255 mov a,pcbit setb c rlc a movx @r0,a ;wr signal ret ; cl_pc: setb a0_8255 ;ctrl register select=11 setb a1_8255 mov a,pcbit clr c rlc a movx @r0,a ;wr signal ret clr key_f ;initial ; ;row-0 ;74139=>q0=0 mov pcbit,#4 ;pc4=0 call cl_pc mov pcbit,#5 ;pc5=0 call cl_pc call rd_pb ;read pb,data store at pb55 call check_key jbc key_f,have_state ;row-1 ;74139=>q1=0 mov pcbit,#4 ;pc4=1 call st_pc mov pcbit,#5 ;pc5=0 call cl_pc call rd_pb ;read pb,data store at pb55 call check_key jbc key_f,have_state ;row-2 ;74139=>q2=0 mov pcbit,#4 ;pc4=0 call cl_pc mov pcbit,#5 ;pc5=1 call st_pc call rd_pb ;read pb,data store to pb55 call check_key jbc key_f,have_state ;row-3 ;74139=>q3=0 mov pcbit,#4 ;pc4=1 call st_pc mov pcbit,#5 ;pc5=1 call st_pc call rd_pb ;read pb,data store to pb55 call check_key jbc key_f,have_state ; ret ; have_state: mov a,keynum cjne a,#0ffh,is_key is_key: ret ;***************check key whether true and count key number check_key: anl pb55,#0x0f ;pb0-pb3 mov a,pb55 mov counter,#4 nextk: rrc a jnc dblchk inc keynum djnz counter,nextk ret ; dblchk: mov keydbl,pb55 mov bounce0,#200 ;about delay time=80mS chklp: mov bounce1,#250 djnz bounce1,$ djnz bounce0,chklp call rd_pb ;read pb,data store to pb55 anl pb55,#0x0f ;pb0-pb3 mov a,pb55 cjne a,keydbl,not_key setb key_f ;have state ret not_key: setb key_f mov keynum,#0ffh ;not key,is bounce or noise ret |