;----------------------------------------------------- ;清屏 clear_screen: mov byte_display_page_memory, #0 lcall clear_line_screen mov byte_display_page_memory, #2 lcall clear_line_screen mov byte_display_page_memory, #4 lcall clear_line_screen mov byte_display_page_memory, #6 ; lcall clear_line_screen ; ret clear_line_screen: mov byte_display_row_memory, #0 mov r3, #08h clear_line_screen_1: mov dptr, #char_kong lcall display_write_32_data djnz r3, clear_line_screen_1 ret ;--------------------------------------------------- ;全屏 fill_line_screen: mov byte_display_row_memory, #0 mov r3, #08h fill_line_screen_1: mov dptr, #char_man lcall display_write_32_data djnz r3, fill_line_screen_1 ret ;----------------------------------------------------- ;连续输出16字节数据到LCD屏 display_write_16_data: mov r5, #8 display_write_16_data_1: lcall display_select_page lcall display_select_row clr a movc a, @a+dptr lcall display_write_data inc dptr djnz r5, display_write_16_data_1 inc byte_display_page_memory clr c mov a, byte_display_row_memory subb a, #8 mov byte_display_row_memory, a mov r5, #8 display_write_16_data_2: lcall display_select_page lcall display_select_row clr a movc a, @a+dptr lcall display_write_data inc dptr djnz r5, display_write_16_data_2 dec byte_display_page_memory ret ;--------------------------------------------------- ;连续输出32字节数据到LCD屏 display_write_32_data: mov r5, #16 display_write_32_data_1: lcall display_select_page lcall display_select_row clr a movc a, @a+dptr lcall display_write_data inc dptr djnz r5, display_write_32_data_1 inc byte_display_page_memory clr c mov a, byte_display_row_memory subb a, #16 mov byte_display_row_memory, a mov r5, #16 display_write_32_data_2: lcall display_select_page lcall display_select_row clr a movc a, @a+dptr lcall display_write_data inc dptr djnz r5, display_write_32_data_2 dec byte_display_page_memory ret ;----------------------------------------------------------- display_write_data: ;数据在A中 nop ;如果列的数目大于63,则应该显示到右半屏幕,否则应该显示在左半屏幕 ;注意,此处显示手册上给出的说明不准确 jb byte_display_row_memory.6, display_write_data_left setb pin_display_right_cs sjmp display_write_data_leftright display_write_data_left: setb pin_display_left_cs
display_write_data_leftright: clr pin_display_rw setb pin_display_di nop setb pin_display_enable mov p0, a nop clr pin_display_enable nop setb pin_display_rw clr pin_display_right_cs clr pin_display_left_cs nop inc byte_display_row_memory ; ljmp delay_100us ; lcall delay_100us ret ;----------------------------------------------------- display_on: mov a, #3fh sjmp display_write_instrument display_off: mov a, #3eh sjmp display_write_instrument ;------------------------- display_select_z: ;此处是修改DDR和屏幕的对应关系 mov a, #0c0h sjmp display_write_instrument ;------------------------- display_select_page: display_select_x: ;此处是选择要写入的DDR的页码 mov a, byte_display_page_memory orl a, #0f8h clr acc.6 sjmp display_write_instrument ;------------------------- display_select_row: display_select_y: mov a, byte_display_row_memory orl a, #0c0h clr acc.7 ; sjmp display_write_instrument ; ret ;------------------------- display_write_instrument: ;指令在A中 setb pin_display_right_cs setb pin_display_left_cs clr pin_display_rw clr pin_display_di nop setb pin_display_enable mov p0, a nop clr pin_display_enable nop setb pin_display_rw clr pin_display_right_cs clr pin_display_left_cs ; ljmp delay_100us ; lcall delay_100us ret display_write_16_data_a: mov r5, #16 display_write_16_data_b: lcall display_select_page lcall display_select_row clr a movc a, @a+dptr lcall display_write_data inc dptr djnz r5, display_write_16_data_b inc byte_display_page_memory clr c mov a, byte_display_row_memory subb a, #16 mov byte_display_row_memory, a ret ;----------------------------------------------------- 说明一下:这个屏是分左右半屏的,型号好像是rt12864A,不带字库。你可以看瑞特公司的文档,有例程 |