1. 求LCD顯示模塊 實現NiosII驅動240X128LCD顯示 VHDL語言編程 急求,求好心人幫助
/drivers/video/niosii/nois11.c
自己去看吧。還要看/drivers/video/fbmem.c 這裡面的函數有些會被調用.
給你舉個例子:
staticvoidipu_clear_usage(intipu,intdi)
{
ipu_usage[ipu][di]=false;
}
/*!
*.Itiscalledringthe
*driverbindingprocess.
*thisroutine:Framebufferinitialization,Memoryallocationand
*mapping,Framebufferregistration,IPUinitialization.
*
*@
*/
staticintmxcfb_probe(structplatform_device*pdev)
{
structipuv3_fb_platform_data*plat_data=pdev->dev.platform_data;
structfb_info*fbi;
structmxcfb_info*mxcfbi;
structresource*res;
structdevice*disp_dev;
charbuf[32];
intret=0;
/*InitializeFBstructures*/
fbi=mxcfb_init_fbinfo(&pdev->dev,&mxcfb_ops);
if(!fbi){
ret=-ENOMEM;
gotoinit_fbinfo_failed;
}
ret=mxcfb_option_setup(pdev,fbi);
if(ret)
gotoget_fb_option_failed;
/**********byzxyadd:modpara*************************************************
printk(" byzxy1:fbi->var.xres=0x%x,fbi->var.yres=0x%x ",fbi->var.xres,fbi->var.yres);
printk(" byzxy1:fbi->var.xres_virtual=0x%x,fbi->var.yres_virtual=0x%x ",fbi->var.xres_virtual,fbi->var.yres_virtual);
fbi->var.xres=800;
fbi->var.yres=480;
fbi->var.xres_virtual=1920;
fbi->var.yres_virtual=1440;
printk(" byzxy2:fbi->var.xres=0x%x,fbi->var.yres=0x%x ",fbi->var.xres,fbi->var.yres);
printk(" byzxy2:fbi->var.xres_virtual=0x%x,fbi->var.yres_virtual=0x%x ",fbi->var.xres_virtual,fbi->var.yres_virtual);
/***********************************************************/
mxcfbi=(structmxcfb_info*)fbi->par;
spin_lock_init(&mxcfbi->lock);
mxcfbi->fbi=fbi;
mxcfbi->ipu_int_clk=plat_data->int_clk;
mxcfbi->late_init=plat_data->late_init;
mxcfbi->first_set_par=true;
mxcfbi->panel_width_mm=plat_data->panel_width_mm;
mxcfbi->panel_height_mm=plat_data->panel_height_mm;
ret=mxcfb_dispdrv_init(pdev,fbi);
//byzxyadd
//printk(" byzxy1:mxcfbi->default_bpp==%d ",mxcfbi->default_bpp);
//mxcfbi->default_bpp=16;
//printk(" byzxy1:mxcfbi->default_bpp==%d ",mxcfbi->default_bpp);
if(ret<0)
gotoinit_dispdrv_failed;
ret=ipu_test_set_usage(mxcfbi->ipu_id,mxcfbi->ipu_di);
if(ret<0){
dev_err(&pdev->dev,"ipu%d-di%dalreadyinuse ",
mxcfbi->ipu_id,mxcfbi->ipu_di);
gotoipu_in_busy;
}
res=platform_get_resource(pdev,IORESOURCE_MEM,0);
if(res&&res->start&&res->end){
fbi->fix.smem_len=res->end-res->start+1;
fbi->fix.smem_start=res->start;
// printk(" byzxy2:fbi->fix.smem_start=0x%x ",fbi->fix.smem_start);
fbi->screen_base=ioremap(fbi->fix.smem_start,fbi->fix.smem_len);
// printk(" byzxy3:fbi->screen_base=0x%x ",fbi->screen_base);
// printk(" byzxy4:fbi->fix.smem_len=0x%x ",fbi->fix.smem_len);
//byzxysee2
/*.*/
if(!mxcfbi->late_init)
memset(fbi->screen_base,0,fbi->fix.smem_len);
}
mxcfbi->ipu=ipu_get_soc(mxcfbi->ipu_id);
if(IS_ERR(mxcfbi->ipu)){
ret=-ENODEV;
gotoget_ipu_failed;
}
/**/
if(!g_dp_in_use[mxcfbi->ipu_id]){
mxcfbi->ipu_ch_irq=IPU_IRQ_BG_SYNC_EOF;
mxcfbi->ipu_ch_nf_irq=IPU_IRQ_BG_SYNC_NFACK;
mxcfbi->ipu_alp_ch_irq=IPU_IRQ_BG_ALPHA_SYNC_EOF;
mxcfbi->ipu_vsync_pre_irq=mxcfbi->ipu_di?
IPU_IRQ_VSYNC_PRE_1:
IPU_IRQ_VSYNC_PRE_0;
mxcfbi->ipu_ch=MEM_BG_SYNC;
/**/
if(pdev->id==0)
mxcfbi->cur_blank=mxcfbi->next_blank=FB_BLANK_UNBLANK;
else
mxcfbi->cur_blank=mxcfbi->next_blank=FB_BLANK_POWERDOWN;
ret=mxcfb_register(fbi);
if(ret<0)
gotomxcfb_register_failed;
ipu_disp_set_global_alpha(mxcfbi->ipu,mxcfbi->ipu_ch,
true,0x80);
ipu_disp_set_color_key(mxcfbi->ipu,mxcfbi->ipu_ch,false,0);
res=platform_get_resource(pdev,IORESOURCE_MEM,1);
ret=mxcfb_setup_overlay(pdev,fbi,res);
if(ret<0){
mxcfb_unregister(fbi);
gotomxcfb_setupoverlay_failed;
}
g_dp_in_use[mxcfbi->ipu_id]=true;
ret=device_create_file(mxcfbi->ovfbi->dev,
&dev_attr_fsl_disp_property);
if(ret)
dev_err(mxcfbi->ovfbi->dev,"Error%doncreating"
"filefordispproperty ",
ret);
ret=device_create_file(mxcfbi->ovfbi->dev,
&dev_attr_fsl_disp_dev_property);
if(ret)
dev_err(mxcfbi->ovfbi->dev,"Error%doncreating"
"filefordispdevice"
"propety ",ret);
}else{
mxcfbi->ipu_ch_irq=IPU_IRQ_DC_SYNC_EOF;
mxcfbi->ipu_ch_nf_irq=IPU_IRQ_DC_SYNC_NFACK;
mxcfbi->ipu_alp_ch_irq=-1;
mxcfbi->ipu_vsync_pre_irq=mxcfbi->ipu_di?
IPU_IRQ_VSYNC_PRE_1:
IPU_IRQ_VSYNC_PRE_0;
mxcfbi->ipu_ch=MEM_DC_SYNC;
mxcfbi->cur_blank=mxcfbi->next_blank=FB_BLANK_POWERDOWN;
ret=mxcfb_register(fbi);
if(ret<0)
gotomxcfb_register_failed;
}
platform_set_drvdata(pdev,fbi);
ret=device_create_file(fbi->dev,&dev_attr_fsl_disp_property);
if(ret)
dev_err(&pdev->dev,"Error%doncreatingfilefordisp"
"property ",ret);
ret=device_create_file(fbi->dev,&dev_attr_fsl_disp_dev_property);
if(ret)
dev_err(&pdev->dev,"Error%doncreatingfilefordisp"
"devicepropety ",ret);
disp_dev=mxc_dispdrv_getdev(mxcfbi->dispdrv);
if(disp_dev){
ret=sysfs_create_link(&fbi->dev->kobj,
&disp_dev->kobj,"disp_dev");
if(ret)
dev_err(&pdev->dev,
"Error%doncreatingfile ",ret);
}
INIT_WORK(&mxcfbi->vsync_pre_work,mxcfb_vsync_pre_work);
snprintf(buf,sizeof(buf),"mxcfb%d-vsync-pre",fbi->node);
mxcfbi->vsync_pre_queue=create_singlethread_workqueue(buf);
if(mxcfbi->vsync_pre_queue==NULL){
dev_err(fbi->device,
"Failedtoallocvsync-preworkqueue ");
ret=-ENOMEM;
gotoworkqueue_alloc_failed;
}
#ifdefCONFIG_HAS_EARLYSUSPEND
mxcfbi->fbdrv_earlysuspend.level=EARLY_SUSPEND_LEVEL_DISABLE_FB;
mxcfbi->fbdrv_earlysuspend.suspend=mxcfb_early_suspend;
mxcfbi->fbdrv_earlysuspend.resume=mxcfb_later_resume;
mxcfbi->fbdrv_earlysuspend.data=pdev;
register_early_suspend(&mxcfbi->fbdrv_earlysuspend);
#endif
//byzxydel,toloadlogo.bmp
printk(" byzxy3:fbi->var.xres=%d,fbi->var.yres=%d ",fbi->var.xres,fbi->var.yres);
printk(" byzxy3:fbi->var.xres_virtual=%d,fbi->var.yres_virtual=%d ",fbi->var.xres_virtual,fbi->var.yres_virtual);
printk(" byzxy3:fbi->var.bits_per_pixel=%d,fbi->var.pixclock=%d ",fbi->var.bits_per_pixel,fbi->var.pixclock);
// printk(" byzxy3:fbi->var.xres_virtual=0x%x,fbi->var.yres_virtual=0x%x ",fbi->var.xres_virtual,fbi->var.yres_virtual);
#ifdefCONFIG_LOGO
fb_prepare_logo(fbi,0);
fb_show_logo(fbi,0);
#endif
return0;
workqueue_alloc_failed:
mxcfb_setupoverlay_failed:
mxcfb_register_failed:
get_ipu_failed:
ipu_clear_usage(mxcfbi->ipu_id,mxcfbi->ipu_di);
ipu_in_busy:
init_dispdrv_failed:
fb_dealloc_cmap(&fbi->cmap);
framebuffer_release(fbi);
get_fb_option_failed:
init_fbinfo_failed:
returnret;
}
staticintmxcfb_remove(structplatform_device*pdev)
{
structfb_info*fbi=platform_get_drvdata(pdev);
structmxcfb_info*mxc_fbi=fbi->par;
if(!fbi)
return0;
#ifdefCONFIG_HAS_EARLYSUSPEND
unregister_early_suspend(&mxc_fbi->fbdrv_earlysuspend);
#endif
device_remove_file(fbi->dev,&dev_attr_fsl_disp_dev_property);
device_remove_file(fbi->dev,&dev_attr_fsl_disp_property);
mxcfb_blank(FB_BLANK_POWERDOWN,fbi);
mxcfb_unregister(fbi);
mxcfb_unmap_video_memory(fbi);
if(mxc_fbi->ovfbi){
device_remove_file(mxc_fbi->ovfbi->dev,
&dev_attr_fsl_disp_dev_property);
device_remove_file(mxc_fbi->ovfbi->dev,
&dev_attr_fsl_disp_property);
mxcfb_blank(FB_BLANK_POWERDOWN,mxc_fbi->ovfbi);
mxcfb_unsetup_overlay(fbi);
mxcfb_unmap_video_memory(mxc_fbi->ovfbi);
}
ipu_clear_usage(mxc_fbi->ipu_id,mxc_fbi->ipu_di);
if(&fbi->cmap)
fb_dealloc_cmap(&fbi->cmap);
framebuffer_release(fbi);
return0;
}
/*!
*.
*/
staticstructplatform_drivermxcfb_driver={
.driver={
.name=MXCFB_NAME,
},
.probe=mxcfb_probe,
.remove=mxcfb_remove,
.suspend=mxcfb_suspend,
.resume=mxcfb_resume,
};
#ifdefCONFIG_HAS_EARLYSUSPEND
staticvoidmxcfb_early_suspend(structearly_suspend*h)
{
structplatform_device*pdev=(structplatform_device*)h->data;
structfb_info*fbi=platform_get_drvdata(pdev);
structmxcfb_info*mxcfbi=(structmxcfb_info*)fbi->par;
pm_message_tstate={.event=PM_EVENT_SUSPEND};
structfb_eventevent;
intblank=FB_BLANK_POWERDOWN;
if(mxcfbi->ipu_ch==MEM_FG_SYNC)
return;
if(strstr(mxcfbi->dispdrv->drv->name,"hdmi")){
/**/
memset(fbi->screen_base,0,fbi->fix.smem_len);
return;
}
mxcfb_core_suspend(pdev,state);
event.info=fbi;
event.data=␣
fb_notifier_call_chain(FB_EVENT_BLANK,&event);
}
staticvoidmxcfb_later_resume(structearly_suspend*h)
{
structplatform_device*pdev=(structplatform_device*)h->data;
structfb_info*fbi=platform_get_drvdata(pdev);
structmxcfb_info*mxcfbi=(structmxcfb_info*)fbi->par;
structfb_eventevent;
if(mxcfbi->ipu_ch==MEM_FG_SYNC)
return;
/**/
if(strstr(mxcfbi->dispdrv->drv->name,"hdmi"))
return;
mxcfb_core_resume(pdev);
event.info=fbi;
event.data=&mxcfbi->next_blank;
fb_notifier_call_chain(FB_EVENT_BLANK,&event);
}
#endif
/*!
*.Thefunctionregistersthepower
*
*fbmem.c
*
*@
*/
int__initmxcfb_init(void)
{
returnplatform_driver_register(&mxcfb_driver);
}
voidmxcfb_exit(void)
{
platform_driver_unregister(&mxcfb_driver);
}
mole_init(mxcfb_init);
mole_exit(mxcfb_exit);
2. 我想問,12864液晶顯示模塊,在編程時有9個漢字顯示,設置0X80處開始顯示。第九個漢字現在在哪個位子
我在做LCD12864實驗時往第一行寫得數據超了,它就顯示到了第三行。
之後我仔細分析了下原因,因為第一行的起始地址是0x80,而第三行是0x88,僅相差8個字元,所以第一行顯示的8個字元滿了之後,在沒有軟體去寫地址的情況下,地址指針就從0x87跳到了0x88,所以就顯示到了第三行;同理,往第二行0x90寫滿數據之後,沒有軟體去改變這個地址指針時它就自動增加到了0x98,就是第四行。
希望我的回答能幫助到你。
3. C語言的模塊化編程還是不太理解,還請各位大神指點!
C語言是面向過程的語言。
把一件事情分多步驟,細分,這樣更有條理。比如今天你要最晚餐。
第一種方法:你要考慮:去買菜;,去哪裡買,買什麼,坐什麼交通工具去買,怎麼回來,煮飯做飯,用什麼廚具,蒸的?煮的?炒的?做哪種家裡人覺得好吃,以及洗碗,打掃衛生等等
這沒有覺得這種方法很亂。第二種方法就是先分塊:
首先我要考慮的問題(1)買菜(2)做飯(3)洗碗 就6個字,3大塊,不用考慮過多,先把整件事情的步驟列出。然後再在每一塊細分。(1)買菜;(1.1)去哪裡買(1.2)買什麼。這樣第一大塊(買菜)裡面又有兩塊(1.1 和 1.2),當然還可以細分,對於(1.1)去哪裡買 再細分 (1.1.1)交通工具 等等。
是不是覺得做個晚餐 還要弄得這么惡心, 一步一步的來? 一開始我也是這樣想的,但是你用C語言編程,這樣就會很方便,很清晰的。
4. 單片機編程[懸賞]
給你個參考:
這是一個採集方向數據,然後保存到單片機的flash中的程序,用的是msp430f135單片機,方向採集模塊用的是串口電子指南針,都是本人親手寫的,調試後沒問題:如有疑問,聯系本人。[email protected]
/*採用p3口輸入 p2.0中斷 中斷一次採集一次同時寫入一次*/
#include <msp430x13x.h>
/*#define xie 10 0xea00 //5kb
#define xie 9 0xec00
#define xie 8 0xee00
#define xie 7 0xf000
#define xie 6 0xf200
#define xie 5 0xf400
#define xie 4 0xf600
#define xie 3 0xf800
#define xie 2 0xfa00 */
#define xie1 0xfc00
char a[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
char caiji[2],b=0;
int ifg;
void xie( );
void delay(int v) //延時子程序
{ while(v!=0)v--;}
void display(void) //顯示
{char x1,x2,x3;
x1=(caiji[1]/1+256*caiji[0])/100;
x2=((caiji[1]/1+256*caiji[0])%100)/10;
x3=(caiji[1]/1+256*caiji[0])%10;
P5OUT=a[x1];P4OUT=a[x2];P2OUT=a[x3];
}
void main(void)
{
WDTCTL= WDTPW + WDTHOLD;//關閉看門狗
BCSCTL1&=0X7F;
BCSCTL2|=0X88;//8M直通
int j;
P1DIR=0x00; // P1口為輸入
P2DIR=0xff; // P2 口為輸入
P4DIR=0XFF;
P5DIR=0XFF;
P3SEL|=0X30;
P3DIR|=0X10;
UCTL0|=SWRST;//這之後才能對串口模塊其它寄存器做修改
UCTL0=CHAR;//
UTCTL0=SSEL0+SSEL1;//時鍾源為ACLK(只能來自低速晶體)32768
UBR00=65;
UBR10=3;
UMCTL0=0X54;//波特率為9600
UCTL0&=~SWRST;//這之後發送模塊才能工作
ME1|=0x80+0x40;//允許串口模塊工作
IE1|=URXIE0+UTXIE0;//允許發送和接收中斷
IFG1=0X02;//使UTXIFG0復位
_EINT(); //使能中斷,這是一個C編譯器支持的內部過程。
while(1)
{
if(P1IN==0XFE)
{delay(6000);
if(P1IN==0XFE) //p1.0長按 寫模式
{P4OUT=0XF9;
for(j=1;j<2/*11*/;j++)
{
xie(j);
FCTL1=FWKEY; FCTL3=FWKEY+LOCK;//寫完鎖定
}
P4OUT=0x00;
}
}
if(P1IN==0XFD)
{delay(6000);
if(P1IN==0XFD) //p1.1長按 發送模式
{P5OUT=0XF9;
int seg,t;
for(seg=1;seg<2/*11*/;seg++)
{
char *fasong=(char *)xie1-0x0200*(seg-1);
for(t=0;t<512;t++)
{
TXBUF0=*(fasong+t);
delay(300);
}
}
}}}}
void xie(int an) //寫某一段
{ int i;
char *xie_an=(char *)xie1-0x0200*(an-1);
FCTL1=+FWKEY+ERASE;//擦除一段
FCTL3=FWKEY;//解鎖
*xie_an=0;//空寫 啟動擦除
FCTL1=FWKEY+WRT;//開始寫入數據
for(i=0;i<257;i++)
{ if (P1IN==0xFB|P1IN==0xbf)
{delay(6553);
if (P1IN==0xFB|P1IN==0xbf) //p1.2長按 向模塊發送91
{P2OUT=0xf9;TXBUF0=0x91;delay(65500);ifg=1;}
}
if(ifg==1)
{
*xie_an++=caiji[0];
*xie_an++=caiji[1];
ifg=0;display();
}
else
i=i-1;
}
}
#pragma vector=USART0TX_VECTOR //發送中斷
__interrupt void usart0_tx (void)
{;}
#pragma vector=USART0RX_VECTOR //接收中斷
__interrupt void UART0RX0_rx (void)
{
caiji[b]=RXBUF0;delay(300);b=b+1;
if(b==2)b=0;
}
5. 用4位數碼管顯示模塊 如何做一個時鍾,最好是可以用紐扣電池,小白不懂電子方面,希望簡單一些
紐扣電池夠嗆 因為數碼管是主動發光的 很快就會把電耗光
用紐扣電池還是建議用不發光的液晶屏做
做時鍾要看你用什麼做 單片機的話 還需要學匯編語言編程
如果只是搞搞焊接什麼的 網上有現成做好的集成電路 搭上對應的顯示原件就能用
6. FYD12864-0402B液晶顯示模塊C語言程序
/*此程序適用於FYD12864-0402B*/
#include <REG932.H>
#define uchar unsigned char
#define uint unsigned int
//uchar data CMD;
//uchar data DATA;
uchar idata busy,Line,Col;
sbit RS= P2^0;
sbit RW= P2^1;
sbit E= P1^7;
sbit LCD_LIGHT= P2^7;
sbit LCD_RST= P2^6;
code char STR1[]= "成都飛宇達";
code char STR2[]= "歡迎您";
code char STR3[]= "謝謝";
code char STR4[]= "SCCDCYB";
void Read_Busy();
void Delay100us(volatile uint n);
void Clear_LCD();
void Write_Single_CMD(uchar cmd);
void Write_Single_Data(uchar a);
void Init_LCD();
void Display(uchar *ptr,uchar ddram) ;
void Init_IO(void);
void Reset_St7920(void);
void DispSetCursor(uchar LineNum,uchar ColumnNum);
void main(void)
{
uchar i,j;
Init_IO();
Reset_St7920();
// LCD_LIGHT=1;
Clear_LCD();
Init_LCD();
Write_Single_CMD(0X01);
Display(STR1,0X80);
Display(STR2,0X90);
Display(STR3,0X88);
Display(STR4,0X98);
Delay100us(200);
Write_Single_CMD(0x80);
j=0;
for (i=0;i<32;i++)
{
Write_Single_Data(0xb4);
Write_Single_Data(0xde+j);
// Write_Single_CMD(0x01); //將游標移到0x9C
j++;
}
// Write_Single_CMD(0x01); //將游標移到0x9C
Write_Single_CMD(0x01); //游標移到0x9C
Write_Single_CMD(0x34); //將游標移到0x9C
Write_Single_CMD(0x36); //將游標移到0x9C
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x80);
// Write_Single_CMD(0x01); //將游標移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0x00);
Write_Single_Data(0x00);
}
}
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x88);
// Write_Single_CMD(0x01); //將游標移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0x00);
Write_Single_Data(0x00);
}
}
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x80);
// Write_Single_CMD(0x01); //將游標移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0xFF);
Write_Single_Data(0xFF);
}
}
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x88);
// Write_Single_CMD(0x01); //將游標移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0xFF);
Write_Single_Data(0xFF);
}
}
// DispSetCursor(1,3);
// for (i=0;i<64;i++)
// {
// for (j=0;j<16;j++)
// {
// Write_Single_Data(0x3f);
// Write_Single_Data(0xff);
// }
// }
while(1)
{
}
}
void Init_IO(void)
{
P0M1=0X00;
P0M2=0X00; //P0=I/O
P1M1=0X00; //P1.4:輸入(DR)
P1M2=0X00; //P1=P1.6為推挽,其它為I/O
P2M1=0X00; //P2.6、P2.7:輸入(AM、CD)
P2M2=0X00; //P2=I/O
P3M1=0X00;
P3M2=0X00; //P3=I
}
void Read_Busy(void) //讀忙操作
{
P0=0x0ff;
RS=0;
RW=1;
do{
E=1;
busy=P0;
E=0;
}while(busy>0x7f);
}
void Reset_St7920(void)
{
LCD_RST=0;
Delay100us(100);
LCD_RST=1;
Delay100us(200);
}
void Delay100us(volatile uint n)
{
uchar i;
while(n--)
for(i=0;i<40;i++)
;
}
void Write_Single_CMD(uchar cmd) //寫單位元組命令字
{
Read_Busy();
RS=0;
RW=0;
E=1;
P0=cmd;
E=0;
P0=0xff;
}
void Write_Single_Data(uchar a) //寫單位元組數據
{
Read_Busy();
RS=1;
RW=0;
E=1;
P0=a;
E=0;
P0=0xff;
}
void Init_LCD(void) //初始化LCD模塊
{
Write_Single_CMD(0x30); //功能設置--8BIT控制界面,基本指令集
Delay100us(10);
Write_Single_CMD(0x30); //功能設置--8BIT控制界面,基本指令集
Delay100us(5);
Write_Single_CMD(0X0C);
Delay100us(5);
Write_Single_CMD(0x01); //清除屏幕顯示,將DDRAM的地址計數器清零
Delay100us(2);
Write_Single_CMD(0x06); //DDRAM的地址計數器(AC)加1
Delay100us(1);
}
void DispSetCursor(uchar LineNum,uchar ColumnNum)
{
uchar i=0x00;
switch(LineNum&0x0f) //確定行號
{
case 0x00: i=0x80; break;
case 0x01: i=0xa0; break;
case 0x02: i=0x88; break;
case 0x03: i=0xa8; break;
default : break;
}
i = (ColumnNum&0x0f)|i; //確定列號
Write_Single_CMD(i);
}
void Clear_LCD(void)
{
Read_Busy();
RS=0;
RW=0;
P0=0x01;
E=1;
E=0;
}
/*
void ExpandFucntionEnable(void)
Function:
*/
void ExpandFunctionEnable(void)
{
Write_Single_CMD(0x34);
}
/*
void ExpandFunctionDisable(void)
Function:
*/
void ExpandFunctionDisable(void)
{
Write_Single_CMD(0x30);
}
/*
void ClearScreen(void)
Function:
*/
void ClearScreen(void)
{
Write_Single_CMD(0x01);
Delay100us(100);
}
/*
void CursorGoHome(void)
Funtion:
Cursor go home,DDRAM's address counter 'AC=0x00'.
*/
void CursorGoHome(void)
{
Write_Single_CMD(0x02);
}
/*
void DisplayOn(void)
Function:
*/
void DisplayOn(void)
{
Write_Single_CMD(0x0d); //整體顯示開,游標開,游標位置反白禁止
}
/*
void DisplayOff(void)
Function:
*/
void DisplayOff(void)
{
Write_Single_CMD(0x09);
}
/*
void IdleMode(void)
Function:
Expand instruction.
*/
void IdleMode(void)
{
Write_Single_CMD(0x01);
}
/*
void RollInstructionEnable(void)
Function:
Expand instruction.
*/
void RollInstructionEnable(void)
{
Write_Single_CMD(0x03);
}
/*
void RollInstructionDisable(void)
Function:
Expand instruction.
*/
void RollInstructionDisable(void)
{
Write_Single_CMD(0x02);
}
/*
void SetRollAddress(unsigned char WhichLine)
Function:
Expand instruction.
*/
void SetRollAddress(uchar WhichLine)
{
ExpandFunctionEnable();
RollInstructionEnable();
Write_Single_CMD(WhichLine|0x40);
ExpandFunctionDisable();
}
/*
void Sleep(void)
Function:
Expand instruction.
*/
void Sleep(void)
{
Write_Single_CMD(0x08);
}
/*
void Waken(void)
Function:
Expand instruction.
*/
void Waken(void)
{
Write_Single_CMD(0x0c);
}
/*
void NegativeDisplay(uchar WhichLine)
Function:
Expand instruction
WhichLine=1,2,3,4
*/
void NegativeDisplay(uchar WhichLine)
{
if(WhichLine>4)return;
if(WhichLine==0)return;
Write_Single_CMD((WhichLine-1)|0x04);
}
void Display(uchar *ptr,uchar ddram)
{
uchar i,l,x;
l=0;
if(ddram<0x88)
{ Line=0; } //定位行地址:第一行
else if(ddram<0xA0)
{ Line=2; } //定位行地址:第三行
else if(ddram<0xA8)
{ Line=1; } //定位行地址:第二行
else
{ Line=3; } //定位行地址:第四行
Col=0x0f&ddram; //定位列地址
if(Col>0x07)
{ Col=Col-0x08;}
x=Col*2;
Write_Single_CMD(ddram); // 定位顯示起始地址
while ((ptr[l])!='\0')
{l++;}
for (i=0;i<l;i++)
{
Write_Single_Data(ptr[i]); //輸出單個字元
x++;
if (x ==0x10)
{
x=0;
Line++;
switch (Line)
{
case 0:Write_Single_CMD(0x80);
break;
case 1:Write_Single_CMD(0xA0);
break;
case 2:Write_Single_CMD(0x88);
break;
case 3:Write_Single_CMD(0xA8);
}
if (Line>3)
{
Write_Single_CMD(0x80);
Line=0;
}
}
}
}
7. 如何在圖形液晶屏中顯示16*16點陣漢字並通過128*64液晶模塊敘述編程步驟
硬體資源:
1、一片AT89S51單片機
2、由4個8*8點陣LED模塊組成一個16X16點陣LED
3、4個按鍵開關(功能預留)
4、一個REST手動復位按鍵
注意:本電路板耗電較大,正常工作時LM7805穩壓器比較燙手,有條件的客戶可以加裝散熱器或者直接用5V/1A開關電源供電(跳過7805穩壓器)
8. 這個TM1638按鍵數碼顯示模塊可以用來為51單片機編程嗎
TM1638是帶鍵盤掃描介面的LED(發光二極體顯示器)驅動控制專用電路,內部集成有MCU 數字介面、數據鎖存器、LED 高壓驅動、鍵盤掃描等電路。主要應用於冰箱、空調 、家庭影院等產品的高段位顯示屏驅動。
可見,TM1638按鍵數碼顯示模塊可以直接用於51單片機系統,同時實現顯示和按鍵掃描功能,編程也很方便。