導航:首頁 > 編程語言 > 顯示模塊編程

顯示模塊編程

發布時間:2022-10-17 09:30:40

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=&blank;
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單片機系統,同時實現顯示和按鍵掃描功能,編程也很方便。

閱讀全文

與顯示模塊編程相關的資料

熱點內容
浙江標准網路伺服器機櫃雲主機 瀏覽:587
設置網路的伺服器地址 瀏覽:600
java圖形界面設計 瀏覽:751
純前端項目怎麼部署到伺服器 瀏覽:538
瓜子臉程序員 瀏覽:505
如何保證伺服器優質 瀏覽:94
小微信aPP怎麼一下找不到了 瀏覽:299
演算法纂要學術價值 瀏覽:975
程序員你好是什麼意思 瀏覽:801
倩女幽魂老伺服器如何玩 瀏覽:561
電子鍾單片機課程設計實驗報告 瀏覽:999
看加密頻道 瀏覽:381
程序員算不算流水線工人 瀏覽:632
三星電視我的app怎麼卸載 瀏覽:44
簡述vi編譯器的基本操作 瀏覽:507
讓程序員選小號 瀏覽:91
加強數字貨幣國際信息編譯能力 瀏覽:584
購買的app會員怎麼退安卓手機 瀏覽:891
程序員的種類及名稱 瀏覽:294
美國程序員薪資 瀏覽:14