پرینتر یا چاپگر یکی از متداول ترین واحدهای خروجی سیستم های کامپیوتری می باشد که برای تهیه یک سند چاپ شده مورد استفاده قرار می گیرد. یکی از ساده ترین پرینترهای موجود پرینتر حرارتی است که نیازی به جوهر نداشته و می تواند با مکانیزم ایجاد حرارت بر روی کاغذهای مخصوص (و البته ارزان قیمت) عباراتی را چاپ نماید. امروزه این نوع پرینترها به وفور در دستگاه های کارت خوان (POS) فروشگاهی، سیستم های نوبت دهی بانک ها، سیستم های چاپ فاکتور فروشگاه ها، باسکول های بزرگ تعیین وزن بار خودرو و … مشاهده می شود. در این مقاله تصمیم داریم پرینتر حرارتی TTL سریال CSN-A2 را با کمک میکروکنترلر ATmega8 از خانواده AVR و کامپایلر Bascom (بسکام) راه اندازی نماییم. پرینتر استفاده شده از فونت فارسی نیز پشتیبانی می کند و عباراتی با زبان فارسی نیز چاپ خواهیم کرد.
پرینتر حرارتی CSN-A2 دارای دو پورت در قسمت زیرین می باشد که یک پورت مربوط به تغذیه و پورت دیگر مربوط به پورت سریال است. همانطوریکه در تصویر زیر مشاهده می شود پورت سمت چپ مربوط ورودی تغذیه 5 ولت می باشد. پایه وسط به جایی متصل نمی شود و تغذیه باید به دو پایه کناری متصل شود. این پرینتر دارای هیتر بوده و جریان زیادی مصرف می کند؛ پس برای راه اندازی این پرینتر به یک منبع تغذیه آمپر بالا احتیاج خواهید داشت (ما برای راه اندازی از تغذیه 5 ولت 4 آمپر استفاده کردیم). پورت سمت راست نیز همان پورت سریال با پایه های RX و TX و GND می باشد که منطق آن 5 ولت بوده (TTL) و عملا فقط دو پایه RX و GND به میکرو متصل می شود. (به TX و GND میکرو). باودریت (BAUD) این پرینتر در حالت پیشفرض 19200 می باشد و سایر تنظیمات به صورت پیشفرض هستند: یعنی 8 بیت دیتا No Parity و 1 بیت هم STOP bit.
برنامه این پرینتر با بررسی سورس کدهای آماده آردوینو و نیز مطالعه دیتاشیت پرینتر حرارتی CSN-A2 نوشته شده و از زبان C به BASIC برگردانده شده است. برای راحتی کار با این پرینتر، تنظیمات فونت و غیره بصورت توابعی در انتهای برنامه نوشته شده که با فراخوانی آنها می توان اثر آن را در برنامه مشاهده کرد. تعداد 10 سابروتین در این برنامه تعریف شده که مهمترین آنها Init_printer می باشد. با فراخوانی این تابع در ابتدای برنامه، پرینتر تنظیم شده و آماده استفاده می شود. زیربرنامه Align سه رشته right,middle,left را دریافت می کند و برای راست چین، وسط چین و چپ چین کردن متن بکار می رود. سابروتین Font_w2_h2_b یک رشته بصورت”000″ الی “111” دریافت می کند که برای فعال یا غیر فعال کردن همزمان سه خصلت “فونت ضخیم”، “فونت با ارتفاع دوبرابر” و “فونت با پهنای دوبرابر” به کار میرود. مثلا با تنظیم این زیربرنامه به صورت “101” فونت BOLD با عرض دوبرابر (متن کشیده)خواهیم داشت. سابروتین بعدی inverse نام دارد که دو “عدد” 0 یا 1 را قبول می کند. در صورت 1 شدن رنگ نوشته ها و پس زمینه عوض می شود، یعنی بک گراند متن مشکی می شود و خود متن سفید خواهد بود. این کار برای جلب توجه متن در برخی موارد لازم است. مثلا عبارت: “تراکنش ناموفق”. زیربرنامه Font_bold نیز یک عدد 0 یا 1 را پذیرفته و در صورت 1 شدن فونت BOLD می شود، شبیه زیربرنامه Font_w2_h2_b می باشد ولی بصورت مجزا فقط برای تغییر ضخامت نوشته بکار می رود. زیربرنامه Font_width_x2 نیز یک عدد 0 یا 1 را گرفته و درصورت 1 شدن عرض متن را دوبرابر می کند و متنها به صورت کشیده چاپ می شود. زیربرنامه Font_x2 طول و عرض متن را باهم دوبرابر می کند و فونت به طور یکسان دوبرابر می شود. سابروتین Font_updown متن را برعکس چاپ می کند، کاملا سر و ته. سابروتین Font_underline سه عدد 0 یا 1 یا 2 را دریافت می کند. 0 یعنی نوشته های بدون زیرخط، 1 یعنی نوشته با زیرخط نازک و 2 یعنی نوشته با زیرخط ضخیم. سابروتین Line_spacing عددی بین 0 تا 255 را دریافت می کند که تعیین کننده فاصله بین خصوص است. پیشفرض آن 32 می باشد ولی برای رسم اشکال کاراکتری بهتر است روی 0 تنظیم شود تا خطها به هم بچسبند.
پس از انجام تنظیمات نوبت به چاپ متن می رسد. برای چاپ متون لاتین به راحتی با دستور print “test” می توان متن مورد نظر را چاپ کرد. برای متن های فارسی باید کد کاراکترها را که بین 128 تا 255 می باشد با دستور print chr(128) چاپ کرد. مثلا برای چاپ سلام که از سه حرف س لا م تشکیل شده باید کدهای حروف را به ترتیب از آخر به اول مطابق این عبارت در جلوی دستور پرینت نوشت: Print Chr(244) ; Chr(242) ; Chr(168)
به عنوان نکته آخر دستور print chr(10) باعث می شود کاغذ بصورت سفید به اندازه ی حدود یک سانت از پرینتر خارج شود که اصطلاحا به آن فید گفته می شود. در این قسمت کد کامل راه اندازی پرینتر TTL حرارتی فارسی CSN-A2 با بسکام/بیسکام (BASCOM) و میکروی AVR آورده می شود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
'CSN-A2 Thermel Printer By Behnam Zakizadeh @ 97/03/05 [2018] 'avr64.com 'convert from Arduino: 'Ref: 'Adafruit &: 'Example 38.1 - Sparkfun Thermal Printer Test (COM-10438) 'http://tronixstuff.com/tutorials > chapter 38 'Based On Code By Nathan Seidle Of Spark Fun Electronics 2011 $regfile = "m8adef.dat" $crystal = 11059200 $hwstack = 64 $swstack = 64 $framesize = 64 $baud = 19200 '************************ Vars / Const ************************ Const Heattime = 80 Const Heatinterval = 255 Const Printdensity = 15 Const Printbreaktime = 15 '***************************** Sub **************************** Declare Sub Init_printer() Declare Sub Align(byval A As String) 'A=right,middle,left Declare Sub Font_w2_h2_b(byval F As String) 'F= "000" to "111" Declare Sub Font_inverse(byval R As Byte) 'R= 0 OR 1 Declare Sub Font_bold(byval B As Byte) 'B= 0 or 1 Declare Sub Font_width_x2(byval W As Byte) 'W= 0 or 1 Declare Sub Font_x2(byval F As Byte) 'F= 0 or 1 Declare Sub Font_updown(byval U As Byte) 'U= 0 OR 1 Declare Sub Font_underline(byval U As Byte) 'U= 0 (no) OR 1 (thin) OR 2 (thick) Declare Sub Line_spacing(byval L As Byte) 'L=0 to 255 (default=32) '==================== main prog: Waitms 500 Call Init_printer() Call Align( "middle") Call Font_w2_h2_b( "000") Call Font_bold(1) Call Font_width_x2(0) Call Font_x2(1) Call Font_inverse(0) Call Font_updown(0) Call Font_underline(0) Call Line_spacing(32) Print Chr(144) ; Chr(162) ; Chr(161) ; " " ; Chr(244) ; Chr(145) ; Chr(247) ; _ " " ; Chr(249) ; Chr(147) Print "www.AVR64.com" Call Font_bold(0) Call Font_x2(0) Print "CSN-A2 Printer & BASCOM-AVR" Print Chr(244) ; Chr(242) ; Chr(168) 'feed paper Print Chr(10) End '_______________________________________________________________________________ Sub Init_printer() Local Printsetting As Byte 'Modify the print speed and heat Print Chr(27); Print Chr(55); Print Chr(7); 'Default 64 dots = 8*('7'+1) Print Chr(heattime); 'Default 80 or 800us Print Chr(heatinterval); 'Default 2 or 20us 'Modify the print density and timeout Print Chr(18); Print Chr(35); Shift Printdensity , Left , 4 Printsetting = Printdensity Or Printbreaktime Print Chr(printsetting); 'Combination Of Printdensity And Printbreaktime End Sub '_______________________________________________________________________________ Sub Align(byval A As String) Select Case A Case "left": Print Chr(27) ; Chr(97) ; Chr(0); Case "middle": Print Chr(27) ; Chr(97) ; Chr(1); Case "right": Print Chr(27) ; Chr(97) ; Chr(2); End Select End Sub '_______________________________________________________________________________ Sub Font_w2_h2_b(byval F As String) F = "00" + F + "000" Local Tmp As Byte Tmp = Binval(f) Print Chr(27); Print Chr(33); Print Chr(tmp); End Sub '_______________________________________________________________________________ Sub Font_bold(byval B As Byte) Print Chr(27) ; Chr(69) ; Chr(b); 'Print Chr(27) ; Chr(32) ; Chr(b); End Sub '_______________________________________________________________________________ Sub Font_width_x2(byval W As Byte) If W = 1 Then Print Chr(27) ; Chr(14); Else Print Chr(27) ; Chr(20); End If End Sub '_______________________________________________________________________________ Sub Font_x2(byval F As Byte) If F = 1 Then 'Print Chr(29) ; Chr(33) ; Chr(119); 'MAX= 0111-0111 [W-H] Print Chr(29) ; Chr(33) ; Chr(17); '0001-0001 [W-H] Else Print Chr(29) ; Chr(33) ; Chr(0); End If End Sub '_______________________________________________________________________________ Sub Font_inverse(byval R As Byte) Print Chr(29) ; Chr(66) ; Chr(r); End Sub '_______________________________________________________________________________ Sub Font_updown(byval U As Byte) Print Chr(27) ; Chr(123) ; Chr(u); End Sub '_______________________________________________________________________________ Sub Font_underline(byval U As Byte) Print Chr(27) ; Chr(45) ; Chr(u); End Sub '_______________________________________________________________________________ Sub Line_spacing(byval L As Byte) Print Chr(27) ; Chr(51) ; Chr(l); End Sub |
بازدیدها: 1054
سلام
خواستم بگم واقعا سایت پر محتوا و مفیدی دارین.
بهتون تبریک میگم.
سلام خواهش میکنم نظر لطف شماست ?
سلام.
ممنون از سایت خوبتون
تشکر
سلام
درود بر شما ?